使用傅里叶变换从图像中去除周期性噪声
Removing periodic noise from an image using the Fourier Transform
我正在对特定图像执行 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);
在频域中进行滤波是一项棘手的工作。您的代码有一些错误会阻止您重建原始图像:
您正在仅对幅度分量应用过滤。您必须在 原始图像频谱 上执行此操作,而不仅仅是幅度分量。该阶段对于正确重建至关重要。顺便说一句,为了创造一个信号处理术语,您正在实施的是 notch filter 或带阻滤波器,它会去除某些 select 频率。
您通过 fftshift
使光谱居中,但在过滤后您 忘记撤消移位 。您必须对生成的过滤图像调用 ifftshift
以撤消居中。
您正在寻找 对数变换 图像的逆 FFT。请记住,对频谱执行对数变换 仅用于显示 目的。你不要在过滤或求逆时使用它。这样做会给您带来意想不到的后果,因为大部分频谱已因非线性操作而发生变化。您必须在原始图像光谱本身上执行此操作。
一个小注意事项,但请确保在执行逆 FFT 后过滤结果后调用 real
。很可能存在一些由于计算浮点错误导致的残余虚部,因此调用 real
只会提取信号的实部。
经过这些更正,这就是我的代码。我已经直接从 Whosebug 读取了您的图像以使其可重现:
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,[]);
我得到这张图片:
我将添加对原始图像的相当不错的重建。您仍然会看到一些条纹,这在很大程度上取决于陷波滤波器的形状和尺寸。或许将尺寸做得更大甚至更大,将陷波滤波器的形状做成圆形而不是方形。这倾向于保留更多原始图像,因为正方形角引入的硬边缘会产生意想不到的振铃效应。
我正在对特定图像执行 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);
在频域中进行滤波是一项棘手的工作。您的代码有一些错误会阻止您重建原始图像:
您正在仅对幅度分量应用过滤。您必须在 原始图像频谱 上执行此操作,而不仅仅是幅度分量。该阶段对于正确重建至关重要。顺便说一句,为了创造一个信号处理术语,您正在实施的是 notch filter 或带阻滤波器,它会去除某些 select 频率。
您通过
fftshift
使光谱居中,但在过滤后您 忘记撤消移位 。您必须对生成的过滤图像调用ifftshift
以撤消居中。您正在寻找 对数变换 图像的逆 FFT。请记住,对频谱执行对数变换 仅用于显示 目的。你不要在过滤或求逆时使用它。这样做会给您带来意想不到的后果,因为大部分频谱已因非线性操作而发生变化。您必须在原始图像光谱本身上执行此操作。
一个小注意事项,但请确保在执行逆 FFT 后过滤结果后调用
real
。很可能存在一些由于计算浮点错误导致的残余虚部,因此调用real
只会提取信号的实部。
经过这些更正,这就是我的代码。我已经直接从 Whosebug 读取了您的图像以使其可重现:
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,[]);
我得到这张图片:
我将添加对原始图像的相当不错的重建。您仍然会看到一些条纹,这在很大程度上取决于陷波滤波器的形状和尺寸。或许将尺寸做得更大甚至更大,将陷波滤波器的形状做成圆形而不是方形。这倾向于保留更多原始图像,因为正方形角引入的硬边缘会产生意想不到的振铃效应。