how to denoising rgb image?

2 次查看(过去 30 天)
hello i have a question about rgb image denoising. I have a noisy image and when i apply the filter ; the color of image is chang.i want to know why it is happen and how can i get rid of it it? here is my codes and results: clear all clc
exfilt={'*.jpg;*.png'};
[filename,filepath]= uigetfile(exfilt,'pick an image file!');
I=imread ([filepath filename]);
figure,imshow(I);
colormap(jet(256));colorbar;
title('Overlay Image');
[rows, columns, numberOfColorBands] = size(I);
%%adding noise
%speckle noise
SI=imnoise(I,'speckle',0.5);
% adding salt and pepper noise or shot noise
Shot_noise = imnoise(I, "salt & pepper", 0.50);
% total noise
noisy_image=I+SI+Shot_noise;
figure
subplot(1, 4, 1);
imshow(noisy_image);
title('noisy Image1');
% Extract the individual red, green, and blue color channels.
redChannel = noisy_image(:, :, 1);
greenChannel = noisy_image(:, :, 2);
blueChannel = noisy_image(:, :, 3);
% Display the noisy channel images.
subplot(1, 4, 2);
imshow(redChannel);
title('Noisy1 Red Channel');
subplot(1, 4, 3);
imshow(greenChannel);
title('Noisy1 Green Channel');
subplot(1, 4, 4);
imshow(blueChannel);
title('Noisy1 Blue Channel');
%%multiple level median image processing technique
k=2;
hwin=2*k+1;
im_redChannel= padarray(redChannel, [k k],'replicate'); % 'zero-padding'
im_greenChannel= padarray(greenChannel, [k k],'replicate'); % 'zero-padding'
imblueChannel= padarray(blueChannel, [k k],'replicate'); % 'zero-padding'
% imshow(im);
n=5;
[row,col] = size(im_redChannel);
% X Mask
x_diag_up=zeros(hwin,hwin);
x_diag_up(1:n+1:n*n)=1;
x_diag_down=zeros(hwin,hwin);
x_diag_down(n:n-1:n*n-1)=1;
%plus Mask
plus_up=zeros(hwin,hwin);
plus_up(:,3)=1;
plus_right=zeros(hwin,hwin);
plus_right(3,:)=1;
x_diag_up_find =find(x_diag_up); % x pixel positions
x_diag_down_find=find(x_diag_down); % x pixel positions
plus_up_find=find(plus_up); % + pixel position
plus_right_find=find(plus_right); % + pixel position
for p=1:row-4
for q=1:col-4
w_redChannel=im_redChannel(p:p+(hwin-1),q:q+(hwin-1));%sliding window / filter
sw_redChannel=w_redChannel(:)'; %sliding window elements
x_diag_up_val=w_redChannel(x_diag_up_find)';
x_diag_down_val=w_redChannel(x_diag_down_find)';
plus_up_val=w_redChannel(plus_up_find)';
plus_right_val=w_redChannel(plus_right_find)';
c_val=w_redChannel(13);
%Original pixel/ center pixel of the window/filter
M1=(median(x_diag_up_val));
M2=(median(x_diag_down_val));
M3=(median( plus_up_val));
M4=(median(plus_right_val));
median_val=[M1,M2,M3,M4];
minimum=min(median_val);
maximum=max(median_val);
M5=ceil(c_val);
Res_med=[minimum,maximum,M5];
out_redChannel(p,q)=(median(Res_med));
end
end
for p=1:row-4
for q=1:col-4
w_greenChannel=im_greenChannel(p:p+(hwin-1),q:q+(hwin-1));%sliding window / filter
sw_greenChannel=w_greenChannel(:)'; %sliding window elements
x_diag_up_val1=w_greenChannel(x_diag_up_find)';
x_diag_down_val1=w_greenChannel(x_diag_down_find)';
plus_up_val1=w_greenChannel(plus_up_find)';
plus_right_val1=w_greenChannel(plus_right_find)';
c_val1=w_greenChannel(13);
%Original pixel/ center pixel of the window/filter
MM1=(median(x_diag_up_val1));
MM2=(median(x_diag_down_val1));
MM3=(median( plus_up_val1));
MM4=(median(plus_right_val1));
median_val1=[MM1,MM2,MM3,MM4];
minimum1=min(median_val1);
maximum1=max(median_val1);
MM5=ceil(c_val1);
Res_med1=[minimum1,maximum1,MM5];
out_greenChannel(p,q)=(median(Res_med1));
end
end
for p=1:row-4
for q=1:col-4
w_blueChannel=imblueChannel(p:p+(hwin-1),q:q+(hwin-1));%sliding window / filter
sw_blueChannel=w_blueChannel(:)'; %sliding window elements
x_diag_up_val2=w_blueChannel(x_diag_up_find)';
x_diag_down_val2=w_blueChannel(x_diag_down_find)';
plus_up_val2=w_blueChannel(plus_up_find)';
plus_right_val2=w_blueChannel(plus_right_find)';
c_val2=w_blueChannel(13);
%Original pixel/ center pixel of the window/filter
MMM1=(median(x_diag_up_val2));
MMM2=(median(x_diag_down_val2));
MMM3=(median( plus_up_val2));
MMM4=(median(plus_right_val2));
median_val2=[MMM1,MMM2,MMM3,MMM4];
minimum2=min(median_val2);
maximum2=max(median_val2);
MMM5=ceil(c_val2);
Res_med2=[minimum2,maximum2,MMM5];
out_blueChannel(p,q)=(median(Res_med2));
end
end
restored_image = cat(3, out_redChannel, out_blueChannel, out_greenChannel);
figure
subplot(131)
imshow(I)
title(" Original image");
subplot(132)
imshow(noisy_image)
title(" noisy image");
subplot(133)
imshow(restored_image)
title(" restored image");

采纳的回答

Bjorn Gustavsson
Bjorn Gustavsson 2022-1-10
Well nothing but a simple goof. You simply swapped the green and blue channels in this line:
restored_image = cat(3, out_redChannel, out_blueChannel, out_greenChannel);
Try:
restored_image = cat(3, out_redChannel, out_greenChannel, out_blueChannel);
That should be it.
HTH

更多回答(0 个)

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by