convolution.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """
  2. Convolution functions to apply on images
  3. """
  4. # main imports
  5. import numpy as np
  6. def convolution2D(image, kernel, kernel_size=(5, 5)):
  7. """Apply 2D convolution on image using specific kernel from `ipfml.filters.kernels`
  8. Args:
  9. image: 2D image to apply convolution on
  10. kernel: specific kernel from `ipfml.filters.kernels` to use
  11. kernel_size: window size to use (default (5, 5))
  12. Returns:
  13. 2D numpy array obtained from image using kernel
  14. Example:
  15. >>> from ipfml.filters.convolution import convolution2D
  16. >>> from ipfml.filters.kernels import plane_mean
  17. >>> import numpy as np
  18. >>> image = np.arange(81).reshape([9, 9])
  19. >>> convolved_image = convolution2D(image, plane_mean, (3, 3))
  20. >>> convolved_image.shape
  21. (7, 7)
  22. """
  23. img = np.array(image)
  24. width, height = img.shape
  25. kernel_width, kernel_height = kernel_size
  26. if kernel_width % 2 == 0 or kernel_height % 2 == 0:
  27. raise ValueError("Invalid kernel size, need to be of odd size")
  28. padding_height = (kernel_width - 1) / 2
  29. padding_width = (kernel_width - 1) / 2
  30. img_diff = []
  31. for i in range(width):
  32. if i >= padding_width and i < (width - padding_width):
  33. row_diff = []
  34. for j in range(height):
  35. if j >= padding_height and j < (height - padding_height):
  36. # pixel in the center of kernel window size, need to extract window from img
  37. window = img[int(i - padding_width):int(i + padding_width +
  38. 1),
  39. int(j - padding_height
  40. ):int(j + padding_height + 1)]
  41. diff = kernel(window)
  42. row_diff.append(diff)
  43. img_diff.append(row_diff)
  44. return np.array(img_diff)