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