Наложение изображений для уменьшения шума с использованием MATLAB

Я новичок в обработке изображений и начал использовать MATLAB для обработки астрофотографии. Я пытаюсь обработать 10 поврежденных изображений (одно и то же изображение, но с разным шумом) планеты Сатурн с помощью MATLAB. Я узнал, что объединение 10 изображений вместе приводит к изображению с уменьшенным шумом и высоким PSNR, и попробовал приведенный ниже код, чтобы заставить его работать.

Но на выходе получается нечеткое насыщенное изображение без шумоподавления.

введите здесь описание изображения

Не могли бы вы взглянуть на приведенный ниже код и показать мне, где я ошибся?

%% We are going to stack the 10 corrupted images and finally calculate the PSNR SSIM
clearvars;% Clear all the variables
close all;

load('planetdata.mat'); %to load the corrupted Image set (4-D uint8)
Clean = imread('Clean Image of Saturn.jpg');%Clean Image of Saturn.600x800x3 uint8
planet1(: , :, :)   = planetdata(1, :, :, :);%One corrupted Image as reff

% Set the number of images to stack is 10
stack_number = 10;

% Lets use Clean image as reference of dimensions required
im_x = size(Clean, 1);
im_y = size(Clean, 2);
im_z = size(Clean, 3);

% Lets Generate a blank image for image stacking
resultIM = uint8(zeros(im_x, im_y, im_z));

% Iterate through the images to stack
for i = 1:1:stack_number

% Read in the target object image
 CorruptIM(: , :, :)   = planetdata(i, :, :, :);

% Perform image stacking using the target object image
 resultIM = resultIM + CorruptIM;

end

% resultIM = resultIM / stack_number; 

%% Lets Display Results
workspace;  % to Make sure the work space panel is showing.
fontSize = 15;
figure;
subplot(1, 3, 1);
imshow(Clean);
title('Clean Image', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'Position', get(0,'Screensize')); 
% Give a name to the title bar.
set(gcf,'name','Stacking','numbertitle','off')

% Display one corrupt image as reference
subplot(1, 3, 2);
imshow(planet1);
title('Corrupt Image 1 : Ref', 'FontSize', fontSize);

% Display Stacked image
subplot(1, 3, 3);
imshow(resultIM);
title('Stacked Image', 'FontSize', fontSize);

%% PSNR AND SSIM Calculation
%Lets Find PSNR for For Resultant Image

[row,col]   = size(Clean);
size_host   = row*col;
o_double    = double(Clean);
w_double    = double(resultIM);

s=0;
for j = 1:size_host % the size of the original image

s = s+(w_double(j) - o_double(j))^2 ; 
end

mes     =s/size_host;
psnr    =10*log10((255)^2/mes);
fprintf('The PSNR value for Stacked Image is %0.4f.\n',psnr);


%Lets Find SSIM for resultant Image
[ssimval, ssimmap] = ssim(uint8(resultIM),Clean);
fprintf('The SSIM value for Stacked Image is %0.4f.\n',ssimval);

person ncbdrck    schedule 08.05.2017    source источник


Ответы (1)


Я думаю, что это одно утверждение в значительной степени говорит само за себя (выделено мной):

Но результат выглядит как нечеткое насыщенное изображение без шумоподавления.

Похоже, ваши изображения на самом деле насыщаются до верхнего предела для uint8 переменная, которая является типом данных для вашего результирующего изображения resultIM и вашей матрицы данных planetdata. По мере добавления изображений значения пикселей достигают максимального значения 255 для беззнаковых 8-битных целочисленных типов.

Что вам нужно сделать, так это преобразовать данные в более крупный тип для ваших промежуточных вычислений, например более крупный целочисленный тип или плавающий тип точки. Затем, когда ваши вычисления завершены (например, деление суммы на размер стека изображений для получения среднего изображения), вы можете масштабировать и/или округлять свои данные по мере необходимости и преобразовывать их обратно в тип uint8.

person gnovice    schedule 08.05.2017
comment
Спасибо за совет. Я изменил их на двойные, а затем снова на uint8. Я получил хороший результат. - person ncbdrck; 08.05.2017