Apilamiento de imágenes para reducción de ruido usando MATLAB [cerrado]

Soy nuevo en el procesamiento de imágenes y comencé a usar MATLAB para el procesamiento de astrofotografía. Estoy tratando de procesar 10 imágenes corruptas (la misma imagen pero mezclada con diferente ruido) del planeta Saturno usando MATLAB. Aprendí que al apilar las 10 imágenes juntas se obtiene una imagen con reducción de ruido con un PSNR alto y probé la siguiente codificación para que funcione.

Pero la salida parece una imagen saturada poco clara sin reducción de ruido.Imagen de salida

¿Puedes mirar el código y señalarme dónde me equivoqué?

Gracias

%% 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);
Voto para cerrar esta pregunta como fuera de tema porque se trata de programación, no de fotografía. Esta pregunta pertenece a Stack Overflow .
resultIM es una matriz de 8 bits sin firmar. No puede acumular las imágenes de la pila que también son de 8 bits sin firmar sin desbordarse ni envolverse.
Si bien es probable que la parte de la programación esté fuera de tema, el problema es obvio desde un punto de vista fotográfico. Creo que esto es responsable a nivel conceptual, si no a un nivel de "arreglar mi código".
@AJHenderson ese es un buen punto. Revertiría mi voto cercano, pero eso no es posible. Bueno, invierto en principio . =)

Respuestas (3)

El apilamiento de imágenes es un proceso mediante el cual puede reducir el ruido, pero no funciona agregando las imágenes de forma aditiva, sino promediando. La razón por la que funciona el apilamiento es que la señal de la misma foto tomada varias veces será la misma, pero el ruido aleatorio será diferente cada vez.

Si promedias las imágenes, el ruido tenderá a reducirse ya que no es el mismo entre imágenes.

Si observa el código, es un promedio de varias imágenes.
@Olivier: no puedo hablar sobre el contenido del código matlab, pero puedo hablar sobre la imagen del resultado final. La imagen resultante final parece ser mucho más brillante (probablemente una mezcla aditiva o multiplicativa). Por lo tanto, no puede estar haciendo correctamente una mezcla promedio. Cómo hacer específicamente una combinación de imágenes promedio en matlab realmente no es un tema para el sitio.
Tienes razón sobre algo extraño en el código de Matlab. Parece provenir de una mala implementación: agregar valores uint8 varias veces en uno uint8 => desbordamiento instantáneo

Es posible que su ruido no sea cero, pero el problema más importante es que está agregando a una matriz uint8. Estos valores suben a 255 y es probable que se desborden en la segunda imagen.

Debe hacer sus pasos intermedios en coma flotante, y luego convertir a uint8 y quizás normalizar si es necesario.

Sí, esta respuesta debe estar en SO, junto con la pregunta. Aquí va:

Es casi seguro que su "ruido" no sea de media cero. Está agregando todos los valores de ruido en todos los cuadros, lo que naturalmente conduce a un valor promedio para cada R, G, B que es el mismo, es decir, un píxel blanco (o gris). Su imagen final es inútilmente autoescalada por imshow. Dado que no proporcionó el código que usó para sintetizar el ruido, es posible que me equivoque, pero revise sus archivos de solo ruido e intente nuevamente.

editar: agregar información de Sean:

Sin embargo, un problema más inmediato es que debido a que resultIM es del tipo uint8, recorta valores superiores a 255. Al agregar 10 copias diferentes de CorruptIM, parece que una gran cantidad de píxeles se vuelven blancos (255)

Excelente observación sobre el ruido medio distinto de cero. Sin embargo, un problema más inmediato es que, debido resultIMa su tipo, uint8recorta valores superiores a 255. Al agregar 10 copias diferentes de CorruptIM, parece que una gran cantidad de píxeles se vuelven blancos (255).
@Sean gracias: me perdí esa tarea de clase. Como nota al margen, me vuelve loco que MATLAB coaccione todos los objetos en una expresión a la clase más baja (uint8 + double se coacciona a uint8). :-(