图像去噪
程序员文章站
2024-03-18 13:09:52
...
Question:
1. (5 分)实现一个噪声生成器,使其能给一张图片添加高斯噪声(Gaussian noise)或椒盐噪声(salt-andpepper
noise)。这个生成器可以指定高斯噪声的噪声均值和标准差,以及椒盐噪声中两个噪声成分各
自的概率。
2. (10 分)对输入图片添加均值为 0、标准差为 40 的高斯噪声,并将得到的带噪声的图片贴在你的
报告中。接着用算术均值滤波、几何均值滤波和中值滤波(median filtering)分别对图片进行去噪,将滤
波后的三个结果都贴在报告中。比较你得到这些结果,分析各个滤波效果的优劣,并说明理由,篇幅
不超过一页。
3. (10 分)给输入图片添加盐噪声(它的概率为 0.2),将得到的带噪声的图片贴在报告中。然后分
别用调和均值滤波和谐波均值滤波来做去噪处理,并将相应的结果放入报告里。另外,对于谐波均值
滤波,你应该展示两种情况的结果:当Q > 0时,以及当Q < 0时。讨论为什么错误的 Q 值会导致糟糕
的结果,篇幅不超过一页。
4. (10 分)给输入图片添加椒盐噪声(椒噪声和盐噪声的概率都为 0.2),并将相应的带噪声的图片
贴在你的报告中。试着用算术均值滤波、几何均值滤波、最大值滤波(max filtering)、最小值滤波(min
filtering)和中值滤波分别对图片进行去噪,将滤波后的五个结果贴在报告中。分析你得到的结果,讨
论哪一个滤波的结果看起来更好或更差,为什么,篇幅不超过一页。
5. (5 分)描述你是如何实现上述的滤波操作的,包括算术均值滤波、几何均值滤波、调和均值滤
波、谐波均值滤波、最大值滤波、最小值滤波和中值滤波,篇幅不超过一页。
注意:在不同的参数设置下,滤波器的结果可能很不一样。在去噪时,你应该为每个滤波器选择最优
参数(如滤波器的大小),并将相应的参数在报告中注明。
Answer:
function denoising(I,flag)
%¶ÁÈ¡ÔͼÏñ
if isstr(I)
img = imread(I);
end
img = rgb2gray(img);
[M,N] = size(img);
if flag == 1
img1 = double(img);
mean = 0;
std = 40;
g_noise = zeros(M,N);
gaussian = mean + std .* randn(M,N);
for i = 1:M
for j = 1:N
g_noise(i,j) = img1(i,j) + gaussian(i,j);
end
end
g_noise = uint8(g_noise);
figure
subplot(221)
imshow(g_noise)
axis on
title(['¸ß˹ÔëÉùͼÏñ']);
Q=0;
n=3;
temp1=double(g_noise);
temp2=temp1;
temp3=temp1;
temp4=temp1;
for i=1:M-n+1
for j=1:N-n+1
c=temp1(i:i+(n-1),j:j+(n-1));
temp2(i+(n-1)/2,j+(n-1)/2) = sum(c(:).^(Q+1))/sum(c(:).^(Q));
temp3(i+(n-1)/2,j+(n-1)/2) = prod(c(:).^(1/numel(c)));
temp = sort(c(:));
temp4(i+(n-1)/2,j+(n-1)/2) = temp((numel(temp)+1)/2);
end
end
denoising1=uint8(temp2);
denoising2=uint8(temp3);
denoising3=uint8(temp4);
subplot(222)
imshow(denoising1)
axis on
title(['ËãÊý¾ùÖµÂ˲¨Í¼Ïñ']);
subplot(223)
imshow(denoising2)
axis on
title(['¼¸ºÎ¾ùÖµÂ˲¨Í¼Ïñ']);
subplot(224)
imshow(denoising3)
axis on
title(['ÖÐÖµÂ˲¨Í¼Ïñ']);
end
if flag == 2
a = 0;
b = 0.2;
x = rand(M,N);
salt_noise = img;
salt_noise(find(x<a)) = 0;
salt_noise(find(x > a & x<(a+b))) = 1;
salt_noise = uint8(salt_noise);
figure
subplot(221)
imshow(salt_noise);
axis on
title(['½·ÑÎÔëÉùͼÏñ']);
Q1=-1;
Q2=1.5;
Q3=-1.5;
n=3;
temp1=double(salt_noise);
temp2=temp1;
temp3=temp1;
temp4=temp1;
for i=1:M-n+1
for j=1:N-n+1
c=temp1(i:i+(n-1),j:j+(n-1));
temp2(i+(n-1)/2,j+(n-1)/2) = sum(c(:).^(Q1+1))/sum(c(:).^(Q1));
temp3(i+(n-1)/2,j+(n-1)/2) = sum(c(:).^(Q2+1))/sum(c(:).^(Q2));
temp4(i+(n-1)/2,j+(n-1)/2) = sum(c(:).^(Q3+1))/sum(c(:).^(Q3));
end
end
denoising1=uint8(temp2);
denoising2=uint8(temp3);
denoising3=uint8(temp4);
subplot(222)
imshow(denoising1)
axis on
title(['µ÷ºÍ¾ùÖµÂ˲¨Í¼Ïñ']);
subplot(223)
imshow(denoising2)
axis on
title(['Äæг²¨¾ùÖµÂ˲¨Í¼Ïñ£¬Q=1.5']);
subplot(224)
imshow(denoising3)
axis on
title(['Äæг²¨¾ùÖµÂ˲¨Í¼Ïñ£¬Q=-1.5']);
end
if flag == 3
a = 0.2;
b = 0.2;
x = rand(M,N);
pepper_salt = img;
pepper_salt(find(x<a)) = 0;
pepper_salt(find(x > a & x<(a+b))) = 1;
pepper_salt = uint8(pepper_salt);
figure
subplot(231)
imshow(pepper_salt);
axis on
title(['½·ÑÎÔëÉùͼÏñ']);
Q=0;
n=3;
temp1=double(pepper_salt);
temp2=temp1;
temp3=temp1;
temp4=temp1;
temp5=temp1;
temp6=temp1;
for i=1:M-n+1
for j=1:N-n+1
c=temp1(i:i+(n-1),j:j+(n-1));
temp2(i+(n-1)/2,j+(n-1)/2) = sum(c(:).^(Q+1))/sum(c(:).^(Q));
temp3(i+(n-1)/2,j+(n-1)/2) = prod(c(:).^(1/numel(c)));
temp4(i+(n-1)/2,j+(n-1)/2) = max(c(:));
temp5(i+(n-1)/2,j+(n-1)/2) = min(c(:));
temp = sort(c(:));
temp6(i+(n-1)/2,j+(n-1)/2) = temp((numel(temp)+1)/2);
end
end
denoising1=uint8(temp2);
denoising2=uint8(temp3);
denoising3=uint8(temp4);
denoising4=uint8(temp5);
denoising5=uint8(temp6);
subplot(232)
imshow(denoising1)
axis on
title(['ËãÊý¾ùÖµÂ˲¨Í¼Ïñ']);
subplot(233)
imshow(denoising2)
axis on
title(['¼¸ºÎ¾ùÖµÂ˲¨Í¼Ïñ']);
subplot(234)
imshow(denoising3)
axis on
title(['×î´óÖµÂ˲¨Í¼Ïñ']);
subplot(235)
imshow(denoising4)
axis on
title(['×îСֵÂ˲¨Í¼Ïñ']);
subplot(236)
imshow(denoising5)
axis on
title(['ÖÐÖµÂ˲¨Í¼Ïñ']);
end