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