kernels.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. """
  2. Kernel to apply on images using convolution
  3. """
  4. # main imports
  5. import numpy as np
  6. def plane_mean(window):
  7. """Plane mean kernel to use with convolution process on image
  8. Args:
  9. window: the window part to use from image
  10. Returns:
  11. Normalized residual error from mean plane
  12. Example:
  13. >>> from ipfml.filters.kernels import plane_mean
  14. >>> import numpy as np
  15. >>> window = np.arange(9).reshape([3, 3])
  16. >>> result = plane_mean(window)
  17. >>> (result < 0.0001)
  18. True
  19. """
  20. window = np.array(window)
  21. width, height = window.shape
  22. # prepare data
  23. nb_elem = width * height
  24. xs = [int(i / height) for i in range(nb_elem)]
  25. ys = [i % height for i in range(nb_elem)]
  26. zs = np.array(window).flatten().tolist()
  27. # get residual (error) from mean plane computed
  28. tmp_A = []
  29. tmp_b = []
  30. for i in range(len(xs)):
  31. tmp_A.append([xs[i], ys[i], 1])
  32. tmp_b.append(zs[i])
  33. b = np.matrix(tmp_b).T
  34. A = np.matrix(tmp_A)
  35. fit = (A.T * A).I * A.T * b
  36. errors = b - A * fit
  37. residual = np.linalg.norm(errors)
  38. return residual
  39. # return difference between min and max errors
  40. def plane_max_error(window):
  41. """Plane max error kernel to use with convolution process on image
  42. Args:
  43. window: the window part to use from image
  44. Returns:
  45. Difference between max and min error from mean plane
  46. Example:
  47. >>> from ipfml.filters.kernels import plane_max_error
  48. >>> import numpy as np
  49. >>> window = np.arange(9).reshape([3, 3])
  50. >>> result = plane_max_error(window)
  51. >>> (result < 0.0001)
  52. True
  53. """
  54. window = np.array(window)
  55. width, height = window.shape
  56. # prepare data
  57. nb_elem = width * height
  58. xs = [int(i / height) for i in range(nb_elem)]
  59. ys = [i % height for i in range(nb_elem)]
  60. zs = np.array(window).flatten().tolist()
  61. # get residual (error) from mean plane computed
  62. tmp_A = []
  63. tmp_b = []
  64. for i in range(len(xs)):
  65. tmp_A.append([xs[i], ys[i], 1])
  66. tmp_b.append(zs[i])
  67. b = np.matrix(tmp_b).T
  68. A = np.matrix(tmp_A)
  69. fit = (A.T * A).I * A.T * b
  70. errors = b - A * fit
  71. # get absolute values from errors
  72. errors = abs(np.array(errors))
  73. return (errors.max() - errors.min())
  74. def bilateral_diff(window, func=max):
  75. """Bilaeral difference kernel to use with convolution process on image
  76. Apply difference pixel to pixel and keep max on min difference before applying mean
  77. Args:
  78. window: the window part to use from image
  79. func: max or min function to get difference between pixels
  80. Returns:
  81. mean of max or min difference of pixels
  82. Example:
  83. >>> from ipfml.filters.kernels import bilateral_diff
  84. >>> import numpy as np
  85. >>> window = np.arange(9).reshape([3, 3])
  86. >>> result = bilateral_diff(window)
  87. >>> result
  88. 3.0
  89. """
  90. window = np.array(window)
  91. width, height = window.shape
  92. total_row_diff_list = []
  93. total_col_diff_list = []
  94. for i in range(width):
  95. row_diff_list = []
  96. col_diff_list = []
  97. for j in range(height):
  98. diff_row = 0
  99. if i == 0:
  100. diff_row = abs(window[i][j] - window[i + 1][j])
  101. elif i == width - 1:
  102. diff_row = abs(window[i][j] - window[i - 1][j])
  103. else:
  104. diff1 = abs(window[i][j] - window[i - 1][j])
  105. diff2 = abs(window[i][j] - window[i + 1][j])
  106. diff_row = func(diff1, diff2)
  107. if j == 0:
  108. diff_col = abs(window[i][j] - window[i][j + 1])
  109. elif j == height - 1:
  110. diff_col = abs(window[i][j] - window[i][j - 1])
  111. else:
  112. diff1 = abs(window[i][j] - window[i][j - 1])
  113. diff2 = abs(window[i][j] - window[i][j + 1])
  114. diff_col = func(diff1, diff2)
  115. row_diff_list.append(diff_row)
  116. col_diff_list.append(diff_col)
  117. total_row_diff_list.append(sum(row_diff_list) / len(row_diff_list))
  118. total_col_diff_list.append(sum(col_diff_list) / len(col_diff_list))
  119. row_diff = sum(total_row_diff_list) / len(total_row_diff_list)
  120. col_diff = sum(total_col_diff_list) / len(total_col_diff_list)
  121. return func(row_diff, col_diff)