欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图像去噪

程序员文章站 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