2014-11-02 3 views
1

Я хочу добавить гауссовский шум в изображение с оттенками серого 256х256, а затем удалить его. Я пробовал делать с использованием следующего кода, но все, что я получаю, это изображение, которое имеет только шум. Можно ли полностью удалить шум с изображения? И если не в какой степени уменьшить гауссовский шум?Как добавить и удалить шум из изображения

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 = conv2(double(R), ones(3)/9, 'same'); 
U1=uint8(U); 
subplot(2,1,2); 
imshow(U1); 
title('Median Filtered Image'); 

Я планирую реализовать добавление и удаление шума Пуассона, а также соли и перца. Пожалуйста, предложите мне, если есть фильтр, чтобы удалить эти шумы. Пожалуйста, помогите. Заранее спасибо.

+0

Я знаю, что это не совсем ответит на вопрос, так как для другого подхода вы можете просто сохранить исходное неизмененное изображение в другую переменную или файл? – Alex

+0

@AlexB да, сэр, он может быть сохранен в другой переменной. –

ответ

4

Судя по контексту ваших комментариев и интересующему вас вопросу, вы хотите полностью удалить шум из уже поврежденного изображения. Вы можете сделать только полное удаление, если вы знаете функцию импульсного отклика/разброса по точкам (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 

Это то, что я получаю:

enter image description here


Теперь, чтобы ответить на ваши вопросы о различных видах шума, которые вы хотите для фильтрации шумы Пуассона также могут фильтроваться фильтрами нижних частот (средний, гауссовский и т. д.). Соль и перечный шум лучше фильтруются с помощью медианной фильтрации. Вот a great example on how median filtering works for salt and pepper noise.

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

Это процесс проб и ошибок, поэтому вам придется поиграть с параметрами и посмотреть, что вы получаете.


Надеюсь, это правильно ответит на ваши вопросы. Удачи!

+0

сэр очень благодарен за жизнь. Я получил результаты. я изменю значение параметров, чтобы получить лучшие результаты. –

+0

@AbiramiAnbalagan - Добро пожаловать. Удачи! – rayryeng

+1

+1 Очень хорошее объяснение вы все сказали! –

0

На основе вашего комментария представляется приемлемым сохранять исходные, немодифицированные данные изображения из imread() в отдельную переменную массива, которая используется, когда требуется удаление изображения с полностью удаленным шумом.

+0

Сэр мне нужно удалить шум из шумного изображения и найти PSNR. –

+1

Я думал, вы сказали, что приемлемо хранить его в другой переменной? – Alex

+0

@AlexB - Я думаю, что ОП смущает. Я считаю, что они хотят попытаться полностью удалить шум из уже поврежденного изображения, что невозможно. – rayryeng