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

Нелінійні фільтри - medianBlur(), bilateralFilter(),edgePreservingFilter().

Mathedemo
Медіанний фільтр.

При фільтрації медіанним фільтром значення пікселя дорівнює медіані всіх пікселів, які потрапили у вікно. Це досить ефективно для зменшення певного типу шуму (наприклад, шуму солі та перцю) та із значно меншим розмиттям краю у порівнянні з іншими лінійними фільтрами такого ж розміру.

import skimage.measure
from sklearn.metrics import mean_squared_error
from skimage.util import random_noise
img = cv2.imread("cameraman.jpg") # завантажуємо фото
 # додаємо шум сіль та перець
noise_sp = random_noise(img, mode="s&p",amount=0.3)
noise_sp = np.array(255*noise_sp, dtype = 'uint8')
 # Застосовуємо фільтр
median_sp = cv2.medianBlur(noise_img,5)
 # додаємо Гаусівський шум
noise_gauss = random_noise(img, mode='gaussian')
noise_gauss = np.array(255*noise_gauss, dtype = 'uint8')
# Застосовуємо фільтр
median_gauss = cv2.medianBlur(noise_img,5)
#Знаходимо рівень зашумлення та якість фільтрації
[mean_squared_error(img,noise_sp),mean_squared_error(img,noise_noise_gauss)]
[63.425341796875, 93.295]
[mean_squared_error(img,median_sp),mean_squared_error(img,noise_gauss)]  
[26.8555078125, 45.8271484375]

Приклад очищення від шуму типу '' сіль та перець '' (вгорі) та гаусівського шуму (внизу) медіанним фільтром:

Як видно, в метриці MSE рівень зашумленості гаусівським шумом більший ніж шумом ''сіль і перець'', хоча візуальне сприйняття протилежне.

Двосторонній фільтр (Bilateral filter) Двосторонній фільтр використовує комбінацію двох гаусівських фільтрів. Перший фільтр є стандартним гаусівським фільтром і має просторові ваги величина яких обернено пропорційна відстані до центру околу. Другий фільтр використовує тональні ваги, величина яких прямо пропорційна різниці інтенсивностей з центральним пікселем. Двостороння фільтрація реалізується функцією

cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace)
тут sigmaColor, sigmaSpace -- параметри двох гаусівських фільтрів ( в пікселях).

Як видно з Рис. нижче двостороння фільтрація розмиває дрібні деталі на зображенні, але, на відміну від гаусівського і медіанного розмивання, зберігає краї зображення.

Результати розмивання оригінального зображення (першого ліворуч) фільтрами -- двостороннім з параметрами $5,25,25$, гаусівським та медіанним з розміром ядра $5 \times 5$.

OpenCV функція edgePreservingFilter реалізує швидкий алгоритм розмивання із збереженням меж, типовий приклад використання

 cv2.edgePreservingFilter(img,sigma_s=60, sigma_r=0.7)
Результат фільтрації зображено на Рис
Параметр sigma_s контролює рівень згладження вихідного зображення - чим більше його значення, тим більше згладжене стає зображення, але це також повільніше обчислювати. Параметр sigma_r контролює режим згладжування країв. Невеликі значення призводить до згладжування лише дуже подібних кольорів, тоді як кольори, які сильно відрізняються, залишаться без зміни.

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

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