123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- from PIL import Image
- from matplotlib import cm
- import numpy as np
- import ipfml.metrics as metrics
- def fig2data(fig):
- """
- @brief Convert a Matplotlib figure to a 3D numpy array with RGB channels and return it
- @param fig a matplotlib figure
- @return a numpy 3D array of RGB values
- """
- # draw the renderer
- fig.canvas.draw()
-
- # Get the RGBA buffer from the figure
- w,h = fig.canvas.get_width_height()
- buf = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8)
- buf.shape = (w, h, 3)
-
- # canvas.tostring_argb give pixmap in ARGB mode. Roll the ALPHA channel to have it in RGBA mode
- buf = np.roll(buf, 3, axis=2)
- return buf
-
- def fig2img(fig):
- """
- @brief Convert a Matplotlib figure to a PIL Image in RGB format and return it
- @param fig a matplotlib figure
- @return a Python Imaging Library (PIL) image : default size (480,640,3)
- """
- # put the figure pixmap into a numpy array
- buf = fig2data(fig)
- w, h, d = buf.shape
- return Image.frombytes("RGB", (w, h), buf.tostring())
- def get_LAB_L_SVD(image):
- """
- @brief Returns Singular values from LAB L Image information
- @param fig a matplotlib figure
- @return a Python Imaging Library (PIL) image : default size (480,640,3)
- """
- L = metrics.get_LAB_L(image)
- return metrics.get_SVD(L)
- def get_LAB_L_SVD_s(image):
- """
- @brief Returns s (Singular values) SVD from L of LAB Image information
- @param PIL Image
- @return vector of singular values
- """
- L = metrics.get_LAB_L(image)
- return metrics.get_SVD_s(L)
- def get_LAB_L_SVD_U(image):
- """
- @brief Returns U SVD from L of LAB Image information
- @param PIL Image
- @return vector of singular values
- """
- L = metrics.get_LAB_L(image)
- return metrics.get_SVD_U(L)
- def get_LAB_L_SVD_V(image):
- """
- @brief Returns V SVD from L of LAB Image information
- @param PIL Image
- @return vector of singular values
- """
- L = metrics.get_LAB_L(image)
- return metrics.get_SVD_V(L)
- def divide_in_blocks(image, block_size):
- '''
- @brief Divide image into equal size blocks
- @param img - PIL Image
- @param block - tuple (width, height) representing the size of each dimension of the block
- @return list containing all PIL Image block (in RGB)
- Usage :
- >>> import numpy as np
- >>> from PIL import Image
- >>> from ipfml import image_processing
- >>> image_values = np.random.randint(255, size=(800, 800, 3))
- >>> img = Image.fromarray(image_values.astype('uint8'), 'RGB')
- >>> blocks = divide_in_blocks(img, (20, 20))
- >>> len(blocks)
- 1600
- >>> blocks[0].width
- 20
- >>> blocks[0].height
- 20
- '''
- blocks = []
- # check size compatibility
- width, height = block_size
- if(image.width % width != 0):
- raise "Width size issue, block size not compatible"
-
- if(image.height % height != 0):
- raise "Height size issue, block size not compatible"
- nb_block_width = image.width / width
- nb_block_height = image.height / height
- image_array = np.array(image)
- for i in range(int(nb_block_width)):
- begin_x = i * width
- for j in range(int(nb_block_height)):
- begin_y = j * height
- # getting subblock information
- current_block = image_array[begin_x:(begin_x + width), begin_y:(begin_y + height)]
- blocks.append(Image.fromarray(current_block.astype('uint8'), 'RGB'))
- return blocks
|