Проблема с усреднением поврежденных изображений для устранения шума в MATLAB.
-
20-09-2019 - |
Вопрос
Я хочу усреднить некоторые изображения .jpg, которые искажены гауссовским аддитивным шумом с нулевым средним значением.Покопавшись, я решил сложить матрицы изображений и разделить сумму на количество матриц.Однако полученное изображение полностью черное.Обычно, когда количество изображений увеличивается, результирующее изображение становится лучше.Но когда я использую больше изображений, изображение становится темнее.
Я использую черно-белые изображения .jpg размером 800x600.Вот сценарий, который я использовал:
image1 = imread ('PIC1.jpg');
image2 = imread ('PIC2.jpg');
image3 = imread ('PIC3.jpg');
image4 = imread ('PIC4.jpg');
sum = image1 + image2 + image3 + image4;
av = sum / 4;
imshow(av);
Решение
Проблема, вероятно, в том, что все данные изображения имеют тип uint8
, поэтому их сложение приводит к насыщению со значением 255 для значений пикселей, что дает вам в основном белое изображение, которое затем выглядит в основном черным, когда вы затем делите его на количество изображений.Вам следует преобразовать изображения в другой тип данных, например double
, затем выполните усреднение, а затем преобразуйте обратно в uint8
:
% Load your images:
image1 = imread('PIC1.jpg');
image2 = imread('PIC2.jpg');
image3 = imread('PIC3.jpg');
image4 = imread('PIC4.jpg');
% Convert the images to type double and sum them:
imageSum = double(image1) + double(image2) + double(image3) + double(image4);
% Divide by the number of images and convert back to type uint8:
averageImage = uint8(imageSum./4);
% Display the averaged image:
imshow(averageImage);
ПРИМЕЧАНИЕ: Вам следует избегать присвоения переменным тех же имен, что и любым существующим функциям, поскольку это может вызвать проблемы/путаницу.Вот почему я изменил переменную sum
к imageSum
(есть встроенная функция sum
).
Другие советы
Альтернативное решение с использованием ИМЛИНКОМБ из панели инструментов обработки изображений:
I = imlincomb(0.25,I1, 0.25,I2, 0.25,I3, 0.25,I4);
Вы также можете использовать imagesc(averageImage);Эта функция автоматически масштабирует изображение и не будет выглядеть черным.