Мин фильтр в Python с использованием OpenCV - PullRequest
3 голосов
/ 05 апреля 2020

Я пытаюсь применить мин фильтр к некоторым изображениям, используя библиотеку OpenCV. Как я могу реализовать мин фильтр в Python с использованием OpenCV? Есть ли какая-либо функция для этого? Если нет, то как я могу написать один?

Ответы [ 3 ]

2 голосов
/ 05 апреля 2020

Морфологическая эрозия - это минимальный фильтр. В OpenCV это реализовано в функции erode.

1 голос
/ 05 апреля 2020

Под min filter Полагаю, вы имеете в виду запуск ядра через каждое место на изображении и замену центра ядра значением min в пикселях ядра.

Для достижения этого в Opencv вы можете просто использовать, cv2.erode. Документация здесь .

Но сначала вам нужно определить размер и форму ядра. Вы используете cv.getStructuringElement do c здесь :

Пример:

size = (3, 3)
shape = cv2.MORPH_RECT
kernel = cv2.getStructuringElement(shape, size)
min_image = cv2.erode(image, kernel)
0 голосов
/ 15 апреля 2020

В дополнение к предыдущим ответам, я реализую в python + opencv код, который применяет минимальный и максимальный фильтр коробки.

import cv2

def minimumBoxFilter(n, path_to_image):
  img = cv2.imread(path_to_image)

  # Creates the shape of the kernel
  size = (n, n)
  shape = cv2.MORPH_RECT
  kernel = cv2.getStructuringElement(shape, size)

  # Applies the minimum filter with kernel NxN
  imgResult = cv2.erode(img, kernel)

  # Shows the result
  cv2.namedWindow('Result with n ' + str(n), cv2.WINDOW_NORMAL) # Adjust the window length
  cv2.imshow('Result with n ' + str(n), imgResult)


def maximumBoxFilter(n, path_to_image):
  img = cv2.imread(path_to_image)

  # Creates the shape of the kernel
  size = (n,n)
  shape = cv2.MORPH_RECT
  kernel = cv2.getStructuringElement(shape, size)

  # Applies the maximum filter with kernel NxN
  imgResult = cv2.dilate(img, kernel)

  # Shows the result
  cv2.namedWindow('Result with n ' + str(n), cv2.WINDOW_NORMAL) # Adjust the window length
  cv2.imshow('Result with n ' + str(n), imgResult)


if __name__ == "__main__":
  path_to_image = 'images/africa.tif'

  print("Test the function minimumBoxFilter()")
  minimumBoxFilter(3, path_to_image)
  minimumBoxFilter(5, path_to_image)
  minimumBoxFilter(7, path_to_image)
  minimumBoxFilter(11, path_to_image)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

  print("Test the function maximumBoxFilter()")
  maximumBoxFilter(3, path_to_image)
  maximumBoxFilter(5, path_to_image)
  maximumBoxFilter(7, path_to_image)
  maximumBoxFilter(11, path_to_image)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

, где path_to_image - строка. Например: 'images / africa.tif'

Я получаю следующие результаты:

С минимальным фильтром:

result of minimum filter

с максимальным фильтром: result of maximum filter

...