Усереднюючий фільтр (Averaging). Фільтр замінює значення пікселя на середнє арифметичне всіх пікселів які потрапили у вікно. Ядро усередненого фільтру є $n \times n$-матрицею кожен елемент якої рівний $\frac{1}{n^2}$.
В OpenCV усереднюючий фільтр реалізує функція
img_average_filter = cv2.blur(img, (n,n))# (n,n)-розмір ядра фільтра
Для посилення ефекту розмиття збільшують розмір ядра фільтру, або застосовують його повторно. Небажаним ефектом усереднюючого фільтру, крім розмивання країв, є розмиття ним країв зображення, які є зоною високої частоти, є поява артефактів у вигляді ''квадратів'' при збільшенні розміру ядра.
Гаусівське розмиття (bluring). Це фільтр який є дискретизацією і квантуванням функції щільності двовимірного нормального розподілу Гауса з дисперсією $\sigma$ і нульовим математичним сподіванням: $$ G(x,y)=\frac{1}{2 \pi \sigma^2} e^{-\frac{x^2+y^2}{2 \sigma^2 }} $$ Приклади цілих фільтрів Гауса розміру 3 і 5 на Рис:
Фільтрація з $(d,d)$-ядром і дисперсією $\sigma$ реалізується функцієюcv2.GaussianBlur(img,(d,d),sigma)
Приклади розмивання зображення показано на Рис
Для придушення гаусівського шуму використовуються фільтри fastNlMeansDenoising() -- для напівтонових зображень, і fastNlMeansDenoisingColored() для кольорових.
Приклад виклику функції із стандартним набором параметрів
dst = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)
Для одночасної роботи з послідовністю зображень ( при обробці відео) використовуються функції fastNlMeansDenoisingMulti() i fastNlMeansDenoisingColoredMulti(). Приклад очищення відео він гаусівського шуму
cap = cv.VideoCapture('test.avi')
# створюємо список із перший п'яти кадрів
img = [cap.read()[1] for i in range(5)]
# очищуємо
dst = cv2.fastNlMeansDenoisingColoredMulti(img, 2, 5, None, 4, 7, 35)
В загальному випадку для фільтрації з довільноим ядром використовується функція filter2D():
#задаємо 5x5-ядро фільтра
kernel = np.array([[1, 2, 1, 3, 1],
[1, 1, 1, 1, 1],
[1, 1, 5, 1, 1],
[1, 1, 1, 1, 4],
[1, 1, 2, 1, 1]])
kernel = kernel/sum(kernel)
#фільтруємо зображення
img_filter = cv2.filter2D(img_src,-1,kernel)
Немає коментарів:
Дописати коментар