123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- """
- All movements that can be applied on image such as rotations, fusions, flips
- """
- # main imports
- import numpy as np
- # image processing imports
- from PIL import Image
- from skimage import transform as sk_transform
- # ipfml imports
- from ipfml.exceptions import NumpyShapeComparisonException
- def fusion_images(images, pil=True):
- '''Fusion array of images into single image
- Args:
- images: array of images (PIL Image or Numpy array)
- pil: block type returned as PIL Image (default True)
- Returns:
- merged image from array of images
- Raises:
- ValueError: if `images` is not an array or is empty
- NumpyShapeComparisonException: if `images` array contains images with different shapes
- Example:
- >>> import numpy as np
- >>> from ipfml.processing import movement
- >>> image_values_1 = np.random.randint(255, size=(800, 800, 3))
- >>> image_values_2 = np.random.randint(255, size=(800, 800, 3))
- >>> merged_image = movement.fusion_images([image_values_1, image_values_2], pil=False)
- >>> merged_image.shape
- (800, 800, 3)
- '''
- mode = 'RGB'
- dim = 1
- if len(images) == 0:
- raise ValueError('Empty array of images provided...')
- # convert image in numpy array (perhaps not necessary)
- images = [np.asarray(img) for img in images]
- image_array = images[0]
- if image_array.ndim != 3:
- mode = 'L'
- width, height = image_array.shape
- else:
- width, height, dim = image_array.shape
- # raise exception if all images do not have same shape
- if not np.array([image_array.shape == a.shape for a in images]).all():
- raise NumpyShapeComparisonException()
- if dim == 1:
- image_mean = np.empty([width, height])
- else:
- image_mean = np.empty([width, height, dim])
- nb_images = len(images)
- # construction of mean image from rotation
- for i in range(width):
- for j in range(height):
- if dim == 1:
- grey_value = 0
- # for each image we merge pixel values
- for img in images:
- grey_value += img[i][j]
- image_mean[i][j] = grey_value / nb_images
- else:
- for k in range(dim):
- canal_value = 0
- # for each image we merge pixel values
- for img in images:
- canal_value += img[i][j][k]
- image_mean[i][j][k] = canal_value / nb_images
- image_mean = np.array(image_mean, 'uint8')
- if pil:
- return Image.fromarray(image_mean, mode)
- else:
- return image_mean
- def rotate_image(image, angle=90, pil=True):
- """Rotate image using specific angle
- Args:
- image: PIL Image or Numpy array
- angle: Angle value of the rotation
- pil: block type returned as PIL Image (default True)
- Returns:
- Image with rotation applied
- Example:
- >>> from PIL import Image
- >>> import numpy as np
- >>> from ipfml.processing import movement
- >>> image_values = Image.open('./images/test_img.png')
- >>> rotated_image = movement.rotate_image(image_values, 90, pil=False)
- >>> rotated_image.shape
- (200, 200, 3)
- """
- mode = 'RGB'
- image_array = np.asarray(image)
- if image_array.ndim != 3:
- mode = 'L'
- rotated_image = np.array(
- sk_transform.rotate(image_array, angle) * 255, 'uint8')
- if pil:
- return Image.fromarray(rotated_image, mode)
- else:
- return rotated_image
|