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

Posted

技术标签:

【中文标题】使用傅里叶变换从图像中去除周期性噪声【英文标题】:Removing periodic noise from an image using the Fourier Transform 【发布时间】:2016-03-05 19:33:12 【问题描述】:

我正在对特定图像执行 2D FFT,我得到了它的光谱分量。现在该图像已与另一张图像叠加以产生周期性噪声。

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

原图

周期性噪声图像

为了过滤掉它,我使用手动框来掩盖幅度谱中相对于其他分量相当大的分量,如下所示。

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

有谁知道我做错了什么?

下面是屏蔽值的代码,然后继续对屏蔽的光谱图像进行逆二维 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);

【问题讨论】:

可以通过使用数组索引来删除开头的双 for 循环:spec_img([96:106 216:226],115:125)=0 等。 @AndrasDeak 不知道你能做到这一点 - 谢谢! 没问题。这就是我建议熟悉 matlab 本身的原因:) 牢牢掌握该语言的基本要素可以让您的生活更轻松,您的代码也更加优雅和高效。 您是否在 MATLAB Central 论坛中提出问题,他们说它过于宽泛或在这里?这个问题当然不是太宽泛。您向我们展示了您的尝试以及卡在哪里。这非常适合 ***。 顺便说一句,你当然可以继续问图像处理问题:D。我是两个人中唯一一个在那个标签上有金徽章的人,所以这证明了我是多么喜欢这个地区。 【参考方案1】:

在频域中进行过滤是一项棘手的工作。您的代码有一些错误会阻止您重建原始图像:

    您正在仅在幅度分量上应用过滤。您必须在原始图像光谱上执行此操作,而不仅仅是幅度分量。该阶段对于适当的重建至关重要。顺便说一句,为了创造一个信号处理术语,您正在实施的是notch filter 或带阻滤波器,它可以去除某些选择的频率。

    您通过fftshift 使频谱居中,但过滤后您忘记撤消移位。您必须在生成的过滤图像上调用 ifftshift 以撤消居中。

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

    注意事项,但请确保在执行逆 FFT 后过滤结果后调用 real。由于计算浮点错误,很可能存在一些剩余的虚部,因此调用real 只会提取信号的实部。

通过这些更正,这就是我拥有的代码。我已经直接从 *** 读取了您的图像,以便重现:

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,[]);

我得到这张图片:

我将添加对原始图像的很好的重建。您仍然会看到一些条纹,这在很大程度上取决于陷波滤波器的形状和尺寸。也许让尺寸更大,甚至更大,使陷波滤波器的形状变成圆形而不是方形。这倾向于保留更多的原始图像,因为正方形角落引入的硬边缘会产生意想不到的振铃效应。

【讨论】:

这是一个相当愚蠢的错误。我的更新结果现在已经解决了这个问题。这是否与同一个问题有关?如果不是,我很乐意接受这个作为答案。 @SharanDuggirala 看看我上面的评论。我很乐意帮助您调试此问题,但我需要了解更多有关您如何进行转换的信息 - 原始图像在哪里?您用来转换图像的代码在哪里? 你能上传原始图片吗?...不是subplotted成图。 @SharanDuggirala 是的,我愿意。我希望能够重建您的问题并解决它。 刚刚尝试了圆形陷波滤镜,我可以确认图像的条纹少了很多!

以上是关于使用傅里叶变换从图像中去除周期性噪声的主要内容,如果未能解决你的问题,请参考以下文章

图片处理-opencv-12.图像傅里叶变换

图像处理之图像傅里叶变换

计算机视觉 图像的傅里叶变换

PIE SDK傅里叶变换

傅里叶变换及其应用

傅里叶变换在图像处理中的应用