У меня есть это изображение, которое сильно затемнено импульсным (солью и перцем) шумом, и я пытаюсь отфильтровать его с помощью медианного фильтра. Мне удалось отфильтровать изображение до слегка читаемого состояния, но я хочу, чтобы они отфильтровывались до гораздо более четкого изображения. Как можно улучшить мой медианный фильтр?
Изображение представлено массивом (n,m,4) со значениями RGB в оттенках серого от 0 (черный) до 1 (белый). Я использовал матрицу 3x3 для своего медианного фильтра и дал изображению белую рамку шириной 1 пиксель вокруг каждого края.
def medianFilter(image=np.ndarray):
for i in range(1,image.shape[0]):
for j in range(1,image.shape[1]):
square = np.array(image[i-1:i+2,j-1:j+2])
if (square[1,1][0]==1 or square[1,1][0]==0):
square[1,1] = np.median((square))
image[i-1:i+2,j-1:j+2] = square
return image
@ M.Gaddaffi Я предлагаю вам использовать OpenCV
: cv2.medianBlur(img, kernel)
и попробовать разные размеры ядра, затем вы можете выполнить пороговое значение, а затем применить морфологические операции.
Если вы можете загрузить исходное изображение, это поможет нам помочь вам :)
«исходное изображение» означает само изображение, а не его сюжет. -- сделать маску для шумовых пикселей. то игнорировать те во всех восстановительных работах. -- кто-то может захотеть, чтобы вы использовали рисование? - это классное задание. пожалуйста, укажите это заранее. и сформулируйте все задание.
@TomerGeva Я добавил исходное изображение в пост
@TomerGeva спасибо! Изменение размера ядра очень помогло!
Итак, начиная с загруженного вами изображения, мы можем сделать следующее:
import numpy as np
from scipy.signal import medfilt2d
import matplotlib.pyplot as plt
import cv2
img = cv2.imread('fBq2z.png', cv2.IMREAD_GRAYSCALE)
Лучший способ справиться с шумом соли и перца — использовать медианный фильтр. Поскольку на медианный фильтр напрямую влияет размер ядра, слишком маленький размер недостаточен для хорошей оценки медианного значения, а слишком большой будет улавливать артефакты в медианном фильтре. Поиграв с разными размерами ядра, 11
оказался лучшим.
median_kernel = 11
# median filtering
median_filtered = medfilt2d(img, kernel_size=median_kernel)
Результат медианной фильтрации:
Следующим этапом будет исправление мест, где были видны соль и перец. Это делается с помощью раскрашивания изображения. Для традиционного рисования обычно используются два алгоритма, современные подходы используют для этого нейронные сети.
Я буду использовать метод Телеи. Сначала мы создаем маску, в которой у нас есть остатки шума:
# creating a mask for the salt&pepper
mask = np.zeros_like(median_filtered)
mask[median_filtered < 5] = 255
mask[median_filtered > 250] = 255
полученная маска:
И применить inpainting
last = cv2.inpaint(median_filtered,mask,3,cv2.INPAINT_TELEA)
Это дает нам окончательный результат:
Вы можете попробовать использовать открывающий или закрывающий фильтр. Но я по-прежнему считаю, что медиана — лучший фильтр для шума соли и перца.