Задание 2. Реализация медианного фильтра для подавления шума.
Шаги выполнения:
1. Загрузка и подготовка изображения
- Загрузите зашумленное изображение (например, с добавленным "соль-перец" шумом) через `cv2.imread` и преобразуйте его в оттенки серого (можно использовать готовое преобразование или свое из предыдущего задания).
2. Реализация медианного фильтра
- Создайте функцию для применения медианного фильтра с окном 3x3.
- Для каждого пикселя изображения:
- Соберите значения яркости в окрестности 3x3.
- Отсортируйте значения и выберите медиану.
- Замените центральный пиксель медианным значением.
- Обработайте границы изображения (например, игнорируйте пиксели за пределами или продублируйте края).
3. Визуализация результатов
- Выведите исходное зашумленное изображение и результат фильтрации.
- Убедитесь, что шум "соль-перец" значительно уменьшился.
Для наложения шума на изображение можно использовать следующую функцию:
import numpy as np
import os
import cv2
def noisy(image, noise_typ="s&p"):
if noise_typ == "gauss":
row,col,ch= image.shape
mean = 0
var = 0.1
sigma = var**0.5
gauss = np.random.normal(mean,sigma,(row,col,ch))
gauss = gauss.reshape(row,col,ch)
noisy = image + gauss
return noisy
elif noise_typ == "s&p":
row,col,ch = image.shape
s_vs_p = 0.5
amount = 0.004
out = np.copy(image)
# Salt mode
num_salt = np.ceil(amount * image.size * s_vs_p)
coords = [np.random.randint(0, i - 1, int(num_salt))
for i in image.shape]
out[coords] = 1
# Pepper mode
num_pepper = np.ceil(amount* image.size * (1. - s_vs_p))
coords = [np.random.randint(0, i - 1, int(num_pepper))
for i in image.shape]
out[coords] = 0
return out
elif noise_typ == "poisson":
vals = len(np.unique(image))
vals = 2 ** np.ceil(np.log2(vals))
noisy = np.random.poisson(image * vals) / float(vals)
return noisy
elif noise_typ =="speckle":
row,col,ch = image.shape
gauss = np.random.randn(row,col,ch)
gauss = gauss.reshape(row,col,ch)
noisy = image + image * gauss
return noisy
Также можно попробовать применить реализованный метод медианной фильтрации и для других типов шума.
- Для медианного фильтра запрещено применять `cv2.medianBlur`.