Улучшение медианного фильтра для обработки изображений с сильным импульсным (соль и перец) шумом

У меня есть это изображение, которое сильно затемнено импульсным (солью и перцем) шумом, и я пытаюсь отфильтровать его с помощью медианного фильтра. Мне удалось отфильтровать изображение до слегка читаемого состояния, но я хочу, чтобы они отфильтровывались до гораздо более четкого изображения. Как можно улучшить мой медианный фильтр?

Изображение представлено массивом (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

Улучшение медианного фильтра для обработки изображений с сильным импульсным (соль и перец) шумомУлучшение медианного фильтра для обработки изображений с сильным импульсным (соль и перец) шумомУлучшение медианного фильтра для обработки изображений с сильным импульсным (соль и перец) шумом

Улучшение медианного фильтра для обработки изображений с сильным импульсным (соль и перец) шумом

Вы можете попробовать использовать открывающий или закрывающий фильтр. Но я по-прежнему считаю, что медиана — лучший фильтр для шума соли и перца.

Aishwarya Patange 09.04.2022 07:23

@ M.Gaddaffi Я предлагаю вам использовать OpenCV: cv2.medianBlur(img, kernel) и попробовать разные размеры ядра, затем вы можете выполнить пороговое значение, а затем применить морфологические операции.

Bilal 09.04.2022 08:20

Если вы можете загрузить исходное изображение, это поможет нам помочь вам :)

Tomer Geva 09.04.2022 09:40

«исходное изображение» означает само изображение, а не его сюжет. -- сделать маску для шумовых пикселей. то игнорировать те во всех восстановительных работах. -- кто-то может захотеть, чтобы вы использовали рисование? - это классное задание. пожалуйста, укажите это заранее. и сформулируйте все задание.

Christoph Rackwitz 09.04.2022 10:40

@TomerGeva Я добавил исходное изображение в пост

M. Gaddaffi 09.04.2022 21:03

@TomerGeva спасибо! Изменение размера ядра очень помогло!

M. Gaddaffi 10.04.2022 03:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, начиная с загруженного вами изображения, мы можем сделать следующее:

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)

Это дает нам окончательный результат:

Другие вопросы по теме