123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- # main imports
- import os
- import numpy as np
- # image processing imports
- from ipfml.processing import transform
- from ipfml.processing import reconstruction
- from ipfml.filters import convolution, kernels
- from ipfml import utils
- import cv2
- from skimage.restoration import denoise_nl_means, estimate_sigma
- from PIL import Image
- # modules imports
- #from ..utils import data as functions
- # Transformation class to store transformation method of image and get usefull information
- class Transformation():
- def __init__(self, _transformation, _param, _size):
- self.transformation = _transformation
- self.param = _param
- self.size = _size
- def getTransformedImage(self, img):
- if self.transformation == 'svd_reconstruction':
- begin, end = list(map(int, self.param.split(',')))
- h, w = list(map(int, self.size.split(',')))
- img_reconstructed = reconstruction.svd(img, [begin, end])
- data_array = np.array(img_reconstructed, 'uint8')
- img_array = Image.fromarray(data_array)
- img_array.thumbnail((h, w))
- data = np.array(img_array)
- if self.transformation == 'ipca_reconstruction':
- n_components, batch_size = list(map(int, self.param.split(',')))
- h, w = list(map(int, self.size.split(',')))
- img_reconstructed = reconstruction.ipca(img, n_components, batch_size)
- data_array = np.array(img_reconstructed, 'uint8')
-
- img_array = Image.fromarray(data_array)
- img_array.thumbnail((h, w))
- data = np.array(img_array)
- if self.transformation == 'fast_ica_reconstruction':
- n_components = self.param
- h, w = list(map(int, self.size.split(',')))
- img_reconstructed = reconstruction.fast_ica(img, n_components)
- data_array = np.array(img_reconstructed, 'uint8')
-
- img_array = Image.fromarray(data_array)
- img_array.thumbnail((h, w))
- data = np.array(img_array)
- if self.transformation == 'sobel_based_filter':
- k_size, p_limit = list(map(int, self.param.split(',')))
- h, w = list(map(int, self.size.split(',')))
- lab_img = transform.get_LAB_L(img)
- weight, height = lab_img.shape
- sobelx = cv2.Sobel(lab_img, cv2.CV_64F, 1, 0, ksize=k_size)
- sobely = cv2.Sobel(lab_img, cv2.CV_64F, 0, 1,ksize=k_size)
- sobel_mag = np.array(np.hypot(sobelx, sobely), 'uint8') # magnitude
- sobel_mag_limit = functions.remove_pixel(sobel_mag, p_limit)
- # use distribution value of pixel to fill `0` values
- sobel_mag_limit_without_0 = [x for x in sobel_mag_limit.reshape((weight*height)) if x != 0]
- distribution = functions.distribution_from_data(sobel_mag_limit_without_0)
- min_value = int(min(sobel_mag_limit_without_0))
- l = lambda: functions.get_random_value(distribution) + min_value
- img_reconstructed = functions.fill_image_with_rand_value(sobel_mag_limit, l, 0)
-
- img_reconstructed_norm = utils.normalize_2D_arr(img_reconstructed)
- img_reconstructed_norm = np.array(img_reconstructed_norm*255, 'uint8')
- sobel_reconstructed = Image.fromarray(img_reconstructed_norm)
- sobel_reconstructed.thumbnail((h, w))
-
- data = np.array(sobel_reconstructed)
- if self.transformation == 'nl_mean_noise_mask':
- patch_size, patch_distance = list(map(int, self.param.split(',')))
- h, w = list(map(int, self.size.split(',')))
- img = np.array(img)
- sigma_est = np.mean(estimate_sigma(img, multichannel=True))
-
- patch_kw = dict(patch_size=patch_size, # 5x5 patches
- patch_distance=patch_distance, # 13x13 search area
- multichannel=True)
- # slow algorithm
- denoise = denoise_nl_means(img, h=0.8 * sigma_est, sigma=sigma_est,
- fast_mode=False,
- **patch_kw)
-
- denoise = np.array(denoise, 'uint8')
- noise_mask = np.abs(denoise - img)
-
- data_array = np.array(noise_mask, 'uint8')
-
- img_array = Image.fromarray(data_array)
- img_array.thumbnail((h, w))
- data = np.array(img_array)
-
- if self.transformation == 'static':
- # static content, we keep input as it is
- data = img
- return data
-
- def getTransformationPath(self):
- path = self.transformation
- if self.transformation == 'svd_reconstruction':
- begin, end = list(map(int, self.param.split(',')))
- w, h = list(map(int, self.size.split(',')))
- path = os.path.join(path, str(begin) + '_' + str(end)) + '_S_' + str(w) + '_' + str(h)
- if self.transformation == 'ipca_reconstruction':
- n_components, batch_size = list(map(int, self.param.split(',')))
- w, h = list(map(int, self.size.split(',')))
- path = os.path.join(path, 'N' + str(n_components) + '_' + str(batch_size)) + '_S_' + str(w) + '_' + str(h)
- if self.transformation == 'fast_ica_reconstruction':
- n_components = self.param
- w, h = list(map(int, self.size.split(',')))
- path = os.path.join(path, 'N' + str(n_components)) + '_S_' + str(w) + '_' + str(h)
- if self.transformation == 'min_diff_filter':
- w_size, h_size, stride = list(map(int, self.param.split(',')))
- w, h = list(map(int, self.size.split(',')))
- path = os.path.join(path, 'W_' + str(w_size)) + '_' + str(h_size) + '_Stride_' + str(stride) + '_S_' + str(w) + '_' + str(h)
- if self.transformation == 'sobel_based_filter':
- k_size, p_limit = list(map(int, self.param.split(',')))
- h, w = list(map(int, self.size.split(',')))
- path = os.path.join(path, 'K_' + str(k_size)) + '_L' + str(p_limit) + '_S_' + str(w) + '_' + str(h)
- if self.transformation == 'nl_mean_noise_mask':
- patch_size, patch_distance = list(map(int, self.param.split(',')))
- h, w = list(map(int, self.size.split(',')))
- path = os.path.join(path, 'S' + str(patch_size)) + '_D' + str(patch_distance) + '_S_' + str(w) + '_' + str(h)
- if self.transformation == 'static':
- # param contains image name to find for each scene
- path = self.param
- return path
- def getName(self):
- return self.transformation
- def getParam(self):
- return self.param
- def __str__( self ):
- return self.transformation + ' transformation with parameter : ' + self.param
|