使用傅立叶变换从图像中去除周期性噪声

时间:2015-12-01 18:49:30

标签: matlab image-processing filtering signal-processing fft

我正在对特定图像执行2D FFT,并获得其光谱分量。现在,此图像已与另一图像叠加,以产生周期性噪声。

原始图像以及周期性噪声版本如下所示:

原始图片

enter image description here

周期性噪声图像

enter image description here

为了对此进行过滤,我使用手动方框来屏蔽幅度谱中相对于其他组件非常大的组件,如下所示。

enter image description here

完成此操作后,我执行逆FFT,但我没有得到原始图像。

enter image description here

有谁知道我做错了什么?

这是掩盖值的代码,然后继续对掩蔽的光谱图像进行反向2D FFT:

pat1 = imread('Pattern1.png');

spec_orig = fft2(double(pat1));     
spec_orig2 = abs(spec_orig); 
spec_img = fftshift(spec_orig2);

for j = 115:125
    for n = 96:106
        spec_img(n,j) = 0; 
    end
    for n = 216:226
        spec_img(n,j) = 0; 
    end
    for n = 274:284
        spec_img(n,j) = 0; 
    end
    for n = 298:308
        spec_img(n,j) = 0; 
    end
    for n = 12:22
        spec_img(n,j) = 0; 
    end
    for n = 37:47
        spec_img(n,j) = 0; 
    end
end

%Getting Back the Image for Pattern1
figure;subplot(2,1,1);
spec_img = log(1 + spec_img);
imshow(spec_img,[]); 

subplot(2,1,2);
ptnfx = ifft2(spec_img);
imshow(ptnfx);

1 个答案:

答案 0 :(得分:17)

在频域过滤是一项棘手的事情。您的代码有一些错误阻止您重建原始图像:

  1. 您仅对幅度组件应用过滤。您必须在原始图像光谱上执行此操作,而不仅仅是幅度组件。这个阶段对于正确的重建至关重要。顺便说一下,要实现一个信号处理术语,你要实现的是notch filter或带阻滤波器,它可以去除某些选择的频率。

  2. 您通过fftshift集中了频谱,但在您过滤后忘记撤消班次。您必须在生成的过滤图像上调用ifftshift以撤消居中。

  3. 您正在查找对数转换图像的逆FFT。请记住,执行频谱的对数变换仅用于显示目的。您在过滤或查找反向时使用此功能。这样做会给您带来意想不到的后果,因为大部分频谱由于非线性操作而发生了变化。你必须在原始图像光谱本身上进行。

  4. 一个小注释,但请确保在进行逆FFT后过滤结果后调用real。最有可能是由于计算浮点错误导致的一些残余虚部,因此调用real只会提取信号的实际成分。

  5. 通过这些更正,这是我的代码。我直接从StackOverflow读取您的图像是可重现的:

    pat1 = imread('http://i.stack.imgur.com/oIumJ.png');
    
    %// Change
    spec_orig = fft2(double(pat1)); 
    spec_img = fftshift(spec_orig);
    
    for j = 115:125
        for n = 96:106
            spec_img(n,j) = 0; 
        end
        for n = 216:226
            spec_img(n,j) = 0; 
        end
        for n = 274:284
            spec_img(n,j) = 0; 
        end
        for n = 298:308
            spec_img(n,j) = 0; 
        end
        for n = 12:22
            spec_img(n,j) = 0; 
        end
        for n = 37:47
            spec_img(n,j) = 0; 
        end
    end
    
    %// Change
    ptnfx = real(ifft2(ifftshift(spec_img)));
    imshow(ptnfx,[]);
    

    我得到这张图片:

    enter image description here

    我将添加原始图像的相当好的重建。您仍会看到一些条纹,这在很大程度上取决于陷波滤波器的形状和大小。也许使尺寸更大甚至更大,使陷波滤波器的形状为圆形而不是方形。由于方块的边角引入的硬边缘具有意想不到的振铃效果,因此倾向于保留更多的原始图像。