图像去噪

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

猜你喜欢

转载自blog.csdn.net/qq_34200964/article/details/79519448