使用傅里叶变换从图像中去除周期性噪声
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 看看我上面的评论。我很乐意帮助您调试此问题,但我需要了解更多有关您如何进行转换的信息 - 原始图像在哪里?您用来转换图像的代码在哪里? 你能上传原始图片吗?...不是subplot
ted成图。
@SharanDuggirala 是的,我愿意。我希望能够重建您的问题并解决它。
刚刚尝试了圆形陷波滤镜,我可以确认图像的条纹少了很多!以上是关于使用傅里叶变换从图像中去除周期性噪声的主要内容,如果未能解决你的问题,请参考以下文章