我正在对特定图像执行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);
答案 0 :(得分:17)
在频域过滤是一项棘手的事情。您的代码有一些错误阻止您重建原始图像:
您仅对幅度组件应用过滤。您必须在原始图像光谱上执行此操作,而不仅仅是幅度组件。这个阶段对于正确的重建至关重要。顺便说一下,要实现一个信号处理术语,你要实现的是notch filter或带阻滤波器,它可以去除某些选择的频率。
您通过fftshift
集中了频谱,但在您过滤后忘记撤消班次。您必须在生成的过滤图像上调用ifftshift
以撤消居中。
您正在查找对数转换图像的逆FFT。请记住,执行频谱的对数变换仅用于显示目的。您不在过滤或查找反向时使用此功能。这样做会给您带来意想不到的后果,因为大部分频谱由于非线性操作而发生了变化。你必须在原始图像光谱本身上进行。
一个小注释,但请确保在进行逆FFT后过滤结果后调用real
。最有可能是由于计算浮点错误导致的一些残余虚部,因此调用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,[]);
我得到这张图片:
我将添加原始图像的相当好的重建。您仍会看到一些条纹,这在很大程度上取决于陷波滤波器的形状和大小。也许使尺寸更大甚至更大,使陷波滤波器的形状为圆形而不是方形。由于方块的边角引入的硬边缘具有意想不到的振铃效果,因此倾向于保留更多的原始图像。