当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用傅立叶变换从图像中去除周期性噪声》经验,为你挑选了1个好方法。

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

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

原始图像

在此输入图像描述

周期性噪声图像

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

有谁知道我做错了什么?

以下是屏蔽这些值的代码,然后继续对屏蔽的光谱图像进行反向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);

rayryeng - R.. 17

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

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

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

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

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

通过这些更正,这是我的代码.我直接从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,[]);

我得到这个图像:

在此输入图像描述

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



1> rayryeng - R..:

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

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

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

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

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

通过这些更正,这是我的代码.我直接从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,[]);

我得到这个图像:

在此输入图像描述

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

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有