Судя по контексту ваших комментариев и интересующему вас вопросу, вы хотите полностью удалить шум из уже поврежденного изображения. Вы можете сделать только полное удаление, если вы знаете функцию импульсного отклика/разброса по точкам (PSF) процесса ввода шума в первую очередь. Знание PSF и удаление шума с этим обычно называют deconvolution. Поскольку PSF случайного шумового процесса редко известен на практике и тот факт, что шум представляет собой случайный процесс , практически невозможно полностью удалить весь шум. Существуют, конечно, модели шума, которые существуют, но знание точных параметров модели шума, искажающих ваш образ, очень сложно (если нет, невозможно ...) определить.
Вы можете, конечно, удалить большую часть, а вы не получите оригинальное изображение назад, но вы можете смягчить шум с помощью стандартных методов фильтрации шума. Чтобы удалить гауссовский шум, вы можете просто использовать любой стандартный метод фильтрации нижних частот, такой как average filtering или гауссовская фильтрация. Вы также можете использовать Wiener filtering, где он является адаптивным фильтром. Он анализирует окрестности пикселей вашего изображения и вычисляет дисперсию каждого района. Если дисперсия мала, выполняется большее сглаживание и наоборот. Взгляните at this link for a good example.
Теперь в вашем коде вы выложили, вы решили использовать conv2
. Одна небольшая вещь, которую я укажу, заключается в том, что ваш код фильтрации не выполняет медианную фильтрацию. Вы используете средний фильтр. Если вы хотите использовать медианную фильтрацию, вместо этого используйте medfilt2
.
В любом случае, хотя conv2
отлично подходит для любого 2D-сигнала в целом, я бы рекомендовал вместо этого использовать imfilter
. Он специально предназначен для фильтрации изображений (на самом деле линейная фильтрация ...), а также использует библиотеку Intel IPP, если ваш компьютер/процессор поддерживает ее использование. Я попытался запустить ваш код (используя conv2
) на моей машине со стандартным изображением cameraman.tif
, и я получаю вывод, который не является пустым, как указано в ваших комментариях. Я предполагаю, что вы получаете пустое изображение из-за кастинга до uint8
. L
, скорее всего, был преобразован в точное изображение double
, которое колеблется между [0,1]
, и когда вы просто бросаете uint8
, вы получите только изображение с интенсивностями 0 или 1, поэтому вы ничего не видите. Попробуйте преобразовать изображение с помощью im2uint8
, чтобы вы могли контрастировать нормализовать интенсивности до [0,255]
вместо подходящего дисплея с imshow
.
Однако, если вы используете imfilter
, нет необходимости в преобразовании типов, поскольку imfilter
будет уважать то, что тип входного изображения был и будет использовать тот же самый тип для выходного изображения. Таким образом, сделать ваш код выглядеть примерно так:
L = imread('cameraman.tif'); %// Load in image from MATLAB system path
P =0; %mean
Q =0.01; %variance
R = imnoise(L,'gaussian',P,Q); %L-image
subplot(2,1,1);
imshow(R);
title('Gaussian Noise');
U = imfilter(R, ones(3)/9, 'replicate'); %// Change - Use imfilter
subplot(2,1,2);
imshow(U);
title('Average Filtered Image'); %// Changed title to be correct
Это то, что я получаю:
Теперь, чтобы ответить на ваши вопросы о различных видах шума, которые вы хотите для фильтрации шумы Пуассона также могут фильтроваться фильтрами нижних частот (средний, гауссовский и т. д.). Соль и перечный шум лучше фильтруются с помощью медианной фильтрации. Вот a great example on how median filtering works for salt and pepper noise.
Что касается «степени», вы можете удалить шум, который полностью зависит от проб и ошибок. Вам просто нужно фильтровать свое изображение с различными размерами и параметрами фильтра, пока не получите то, что, по вашему мнению, является перцептивно хорошим качеством, или используйте изображение с самым высоким PSNR из всех ваших проб. Очевидно, что чем более шумным является ваш образ, тем более агрессивным должен быть ваш фильтр, но вы рискуете не понимать, как выглядел оригинальный образ.
Это процесс проб и ошибок, поэтому вам придется поиграть с параметрами и посмотреть, что вы получаете.
Надеюсь, это правильно ответит на ваши вопросы. Удачи!
Я знаю, что это не совсем ответит на вопрос, так как для другого подхода вы можете просто сохранить исходное неизмененное изображение в другую переменную или файл? – Alex
@AlexB да, сэр, он может быть сохранен в другой переменной. –