неділя, 2 травня 2021 р.

Лінійні згладжуючі фільтри в OpenCV - blur(), GaussianBlur()

Mathedemo
Розглянемо деякі традиційні фільтри і їх застосування та реалізацію в OpenCV. Низькочастотні фільтри застосовуються для усунення високочастотного шуму, тобто такі фільтри залишають лише високочастнотні області зображення. Деякі найбільш часто використовувані низькочастотні фільтри розмиття.

Усереднюючий фільтр (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)

Приклади розмивання зображення показано на Рис

Приклад розмивання зображення (ліворуч) медіанним фільтром ( посередині) і гаусівським фільтром ( праворуч) з ядрами розміру $13 \times 13$

Для придушення гаусівського шуму використовуються фільтри 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)  

Немає коментарів:

Дописати коментар