Проблема с усреднением поврежденных изображений для устранения шума в MATLAB

Я хочу усреднить некоторые изображения .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);

person amertkara    schedule 15.03.2010    source источник


Ответы (3)


Проблема, вероятно, в том, что все данные изображения имеют тип 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).

person gnovice    schedule 15.03.2010
comment
Большое спасибо, приятель! Я что-то догадывался о типе изображений и на самом деле преобразовал их в двойные, но не преобразовал результат обратно в UNIT8. Спасибо еще раз. - person amertkara; 15.03.2010

Альтернативное решение с использованием IMLINCOMB из набора инструментов для обработки изображений:

I = imlincomb(0.25,I1, 0.25,I2, 0.25,I3, 0.25,I4);
person Amro    schedule 15.03.2010
comment
Решение imlincomb хорошо, потому что оно не делает копий изображений с двойной точностью. И выходное изображение имеет тот же тип, что и входное изображение (uint8), поэтому вам не нужно беспокоиться о масштабировании. - person Steve Eddins; 16.03.2010

Вы также можете использовать imagesc(averageImage); Эта функция с автоматическим масштабированием изображения и не будет казаться черным

person Frank    schedule 18.11.2012
comment
эквивалент для IMSHOW: imshow(averageImage, []) (обратите внимание на проблему насыщения при суммировании) - person Amro; 18.11.2012