data_attributes.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. # main imports
  2. import numpy as np
  3. import sys
  4. # image transform imports
  5. from PIL import Image
  6. from skimage import color
  7. from sklearn.decomposition import FastICA
  8. from sklearn.decomposition import IncrementalPCA
  9. from sklearn.decomposition import TruncatedSVD
  10. from numpy.linalg import svd as lin_svd
  11. from scipy.signal import medfilt2d, wiener, cwt
  12. import pywt
  13. import cv2
  14. from ipfml.processing import transform, compression, segmentation
  15. from ipfml import utils
  16. # modules and config imports
  17. sys.path.insert(0, '') # trick to enable import of main folder module
  18. import custom_config as cfg
  19. from modules.utils import data as dt
  20. def _get_26_attributes(block):
  21. img_width, img_height = 200, 200
  22. lab_img = transform.get_LAB_L(block)
  23. arr = np.array(lab_img)
  24. # compute all filters statistics
  25. def get_stats(arr, I_filter):
  26. e1 = np.abs(arr - I_filter)
  27. L = np.array(e1)
  28. mu0 = np.mean(L)
  29. A = L - mu0
  30. H = A * A
  31. E = np.sum(H) / (img_width * img_height)
  32. P = np.sqrt(E)
  33. return mu0, P
  34. stats = []
  35. kernel = np.ones((3,3),np.float32)/9
  36. stats.append(get_stats(arr, cv2.filter2D(arr,-1,kernel)))
  37. kernel = np.ones((5,5),np.float32)/25
  38. stats.append(get_stats(arr, cv2.filter2D(arr,-1,kernel)))
  39. stats.append(get_stats(arr, cv2.GaussianBlur(arr, (3, 3), 0.5)))
  40. stats.append(get_stats(arr, cv2.GaussianBlur(arr, (3, 3), 1)))
  41. stats.append(get_stats(arr, cv2.GaussianBlur(arr, (3, 3), 1.5)))
  42. stats.append(get_stats(arr, cv2.GaussianBlur(arr, (5, 5), 0.5)))
  43. stats.append(get_stats(arr, cv2.GaussianBlur(arr, (5, 5), 1)))
  44. stats.append(get_stats(arr, cv2.GaussianBlur(arr, (5, 5), 1.5)))
  45. stats.append(get_stats(arr, medfilt2d(arr, [3, 3])))
  46. stats.append(get_stats(arr, medfilt2d(arr, [5, 5])))
  47. stats.append(get_stats(arr, wiener(arr, [3, 3])))
  48. stats.append(get_stats(arr, wiener(arr, [5, 5])))
  49. wave = w2d(arr, 'db1', 2)
  50. stats.append(get_stats(arr, np.array(wave, 'float64')))
  51. data = []
  52. for stat in stats:
  53. data.append(stat[0])
  54. for stat in stats:
  55. data.append(stat[1])
  56. return data
  57. def get_image_features(data_type, block):
  58. """
  59. Method which returns the data type expected
  60. """
  61. data = []
  62. if 'filters_statistics' in data_type:
  63. data = _get_26_attributes(block)
  64. if 'filters_statistics_sobel' in data_type:
  65. data = _get_26_attributes(block)
  66. data = np.array(data)
  67. return data
  68. def w2d(arr, mode='haar', level=1):
  69. #convert to float
  70. imArray = arr
  71. np.divide(imArray, 255)
  72. # compute coefficients
  73. coeffs=pywt.wavedec2(imArray, mode, level=level)
  74. #Process Coefficients
  75. coeffs_H=list(coeffs)
  76. coeffs_H[0] *= 0
  77. # reconstruction
  78. imArray_H = pywt.waverec2(coeffs_H, mode)
  79. imArray_H *= 255
  80. imArray_H = np.uint8(imArray_H)
  81. return imArray_H
  82. def _get_mscn_variance(block, sub_block_size=(50, 50)):
  83. blocks = segmentation.divide_in_blocks(block, sub_block_size)
  84. data = []
  85. for block in blocks:
  86. mscn_coefficients = transform.get_mscn_coefficients(block)
  87. flat_coeff = mscn_coefficients.flatten()
  88. data.append(np.var(flat_coeff))
  89. return np.sort(data)