我正在对特定图像执行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,[]);
我得到这个图像:
我将添加一个非常好的原始图像重建.您仍会看到一些条纹,这在很大程度上取决于陷波滤波器的形状和大小.也许使尺寸更大甚至更大,使陷波滤波器的形状为圆形而不是方形.由于方块的角部引入的硬边缘具有意想不到的振铃效果,因此倾向于保留更多的原始图像.
在频域中进行过滤是一项棘手的事情.您的代码有一些错误阻止您重建原始图像:
您仅对幅度组件应用过滤.您必须在原始图像光谱上执行此操作,而不仅仅是幅度分量.这个阶段对于正确的重建至关重要.顺便说一下,要实现一个信号处理术语,你要实现的是陷波滤波器或带阻滤波器,它可以消除某些选择的频率.
您通过频谱居中,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,[]);
我得到这个图像:
我将添加一个非常好的原始图像重建.您仍会看到一些条纹,这在很大程度上取决于陷波滤波器的形状和大小.也许使尺寸更大甚至更大,使陷波滤波器的形状为圆形而不是方形.由于方块的角部引入的硬边缘具有意想不到的振铃效果,因此倾向于保留更多的原始图像.