2017-05-08 4 views
1

Je suis novice dans le traitement d'image et j'ai commencé à utiliser MATLAB pour le traitement d'astrophotographie. J'essaie de traiter 10 images corrompues (même image mais mélangées avec différents bruits) de la planète Saturne en utilisant MATLAB. J'ai appris qu'en empilant les 10 images ensemble conduit à une image réduite au bruit avec PSNR élevé et essayé le codage ci-dessous pour le faire fonctionner.Empilage d'image pour la réduction du bruit à l'aide de MATLAB

Mais la sortie ressemble à une image saturée imprécise sans réduction du bruit.

enter image description here

Pouvez-vous s'il vous plaît regarder le code ci-dessous et me montrer où je suis allé mal?

%% 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); 

Répondre

1

Je pense que celui-déclaration à peu près dit tout (Souligné par l'auteur):

Mais la sortie ressemble à une image saturée peu claire sans réduction du bruit.

Il ressemble à vos images sont en fait saturant à la limite supérieure pour une variable uint8, qui est le type de données pour votre image résultat resultIM et votre matrice de données planetdata. Lorsque vous continuez d'ajouter des images, les valeurs de pixel saturent à la valeur maximale de 255 pour les types entiers 8 bits non signés. Ce que vous devez faire est de convertir en un type de données plus grand pour vos calculs intermédiaires, tels qu'un integer type plus grand ou un floating point type. Ensuite, une fois vos calculs terminés (par exemple, en divisant la somme par la taille de la pile d'images pour obtenir une image moyenne), vous pouvez redimensionner et/ou arrondir vos données si nécessaire et les convertir en un type uint8.

+0

Merci pour le conseil. Je les ai changé pour doubler le changé en uint8. J'ai un bon résultat. – ncbdrck

+0

@ncbdrck Envisager d'accepter la réponse, puis –