Penumpukan Gambar untuk pengurangan noise menggunakan MATLAB

Saya baru dalam pemrosesan gambar dan mulai menggunakan MATLAB untuk pemrosesan Astrofotografi. Saya mencoba memproses 10 gambar yang rusak (gambar yang sama tetapi dicampur dengan noise berbeda) dari planet Saturnus menggunakan MATLAB. Saya mengetahui bahwa dengan menumpuk 10 gambar bersama-sama akan menghasilkan gambar yang dikurangi noise dengan PSNR tinggi dan mencoba pengkodean di bawah ini untuk membuatnya berfungsi.

Namun keluarannya tampak seperti gambar saturasi yang tidak jelas tanpa pengurangan noise.

masukkan deskripsi gambar di sini

Bisakah Anda melihat kode di bawah ini dan menunjukkan di mana kesalahan saya?

%% 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 sumber


Jawaban (1)


Saya pikir satu pernyataan ini cukup menjelaskan semuanya (penekanan dari saya):

Namun keluarannya terlihat seperti gambar jenuh yang tidak jelas tanpa pengurangan noise.

Sepertinya gambar Anda benar-benar jenuh pada batas atas untuk uint8, yang merupakan tipe data untuk gambar hasil Anda resultIM dan matriks data Anda planetdata. Saat Anda terus menambahkan gambar, nilai piksel menjadi jenuh pada nilai maksimum 255 untuk tipe bilangan bulat 8-bit yang tidak ditandatangani.

Yang perlu Anda lakukan adalah mengonversi ke tipe data yang lebih besar untuk penghitungan perantara, seperti tipe bilangan bulat atau mengambang jenis titik. Kemudian, setelah perhitungan Anda selesai (misalnya membagi jumlah dengan ukuran tumpukan gambar untuk mendapatkan rata-rata gambar), Anda dapat menskalakan dan/atau membulatkan data sesuai kebutuhan dan mengonversinya kembali ke tipe uint8.

person gnovice    schedule 08.05.2017
comment
Terima kasih atas sarannya. Saya mengubahnya menjadi dua kali lipat dan mengubahnya kembali ke uint8. Saya mendapat hasil yang bagus. - person ncbdrck; 08.05.2017