Как на самом деле работает Opencv MedianBlur? - PullRequest
1 голос
/ 13 апреля 2020

Я работал с полутоновым изображением, в котором много шума соли и перца, и узнал, что MedianBlur очень полезен. Поэтому я использовал Python версию Opencv (cv2.medianBlur()). Это сработало, но не сработало так, как я хотел. Поэтому я искал фактический алгоритм, с которым он работал, и получил следующее объяснение:

Если размер ядра (k) равен 5, то для каждого квадратного окна 5 (количество строк) x5 (количество столбцов) центральный пиксель этого окна будет заменен значением медианы всех элементов в нем. Например, рассмотрим это окно:

      [[11,  4, 17,  1,  5],
       [ 6, 14,  0, 12, 16],
       [24, 19, 13, 18, 23],
       [ 7, 11, 11, 10,  5],
       [10, 13, 23,  3,  0]] 

Здесь центральный элемент 13 будет заменен медианой всех этих элементов, т. Е. 11. Это правильно? Если да, что происходит с первыми двумя строками, поскольку в первых двух строках не может быть элементов, которые являются центральным элементом ЛЮБОГО окна? Согласно моим наблюдениям (сравнивая исходное и обработанное изображение), меняются и первые две строки.

Ответы [ 2 ]

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

Согласно документации medianBlur() он использует BORDER_REPLICATE для обработки пикселей границы.

BORDER_REPLICATE 
Python: cv.BORDER_REPLICATE

aaaaaa|abcdefgh|hhhhhhh 

Таким образом, он повторяет граничные пиксели, пока все пиксели не станут серединой пикселя. окна.

РЕДАКТИРОВАТЬ: Чтобы применить ядро ​​размером 5x5, первый пиксель должен быть в третьей строке и столбце изображения. Это означает повторить границу на два пикселя. Таким образом, ваш образ становится таким внутренним:

  [[11, 11, 11,  4, 17,  1,  5,  5,  5],
   [11, 11, 11,  4, 17,  1,  5,  5,  5],
   [11, 11, 11,  4, 17,  1,  5,  5,  5],
   [ 6,  6,  6, 14,  0, 12, 16, 16, 16],
   [24, 24, 24, 19, 13, 18, 23, 23, 23],
   [ 7,  7,  7, 11, 11, 10,  5,  5,  5],
   [10, 10, 10, 13, 23,  3,  0,  0,  0],
   [10, 10, 10, 13, 23,  3,  0,  0,  0],
   [10, 10, 10, 13, 23,  3,  0,  0,  0]]
0 голосов
/ 13 апреля 2020

Из документации:

Медианный фильтр внутренне использует #BORDER_REPLICATE для обработки пикселей границы, см. # BorderTypes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...