При фільтрації медіанним фільтром значення пікселя дорівнює медіані всіх пікселів, які потрапили у вікно. Це досить ефективно для зменшення певного типу шуму (наприклад, шуму солі та перцю) та із значно меншим розмиттям краю у порівнянні з іншими лінійними фільтрами такого ж розміру.
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 -- параметри двох гаусівських фільтрів ( в пікселях).
Як видно з Рис. нижче двостороння фільтрація розмиває дрібні деталі на зображенні, але, на відміну від гаусівського і медіанного розмивання, зберігає краї зображення.
OpenCV функція edgePreservingFilter реалізує швидкий алгоритм розмивання із збереженням меж, типовий приклад використання
cv2.edgePreservingFilter(img,sigma_s=60, sigma_r=0.7)
Результат фільтрації зображено на Рис
Параметр sigma_s контролює рівень згладження вихідного зображення - чим більше його значення, тим більше згладжене стає зображення, але це також повільніше обчислювати.
Параметр sigma_r контролює режим згладжування країв. Невеликі значення призводить до згладжування лише дуже подібних кольорів, тоді як кольори, які сильно відрізняються, залишаться без зміни.
Немає коментарів:
Дописати коментар