使用 FFT 从图像中去除条纹

信息处理 图像处理 fft
2022-01-24 15:55:30

我尝试从图像中删除所有斜率在 110° 和 120° 之间的条纹(图 1a),我的第一个想法是在频域中过滤我的图像。

据我记得,那些条纹的光谱应该占据 20-30° 之间的饼图段(即原始斜率 - 90°),但可以肯定的是,我准备了具有相似图案的人工黑白图像(图. 2a)。看来我的推测是正确的(图 2b)。

现在,我尝试创建一个遮罩并简单地“切断”部分频谱以抑制与 10-120° 条纹相关的高频。

经过几次试验后,我才发现了一个在某种程度上满足我需求的面罩(图 3a)(图 4)。但是,我无法弄清楚这个凭经验获得的掩码与光谱之间的关系。

有人可以给我一些建议,我的代码或推理中的缺陷在哪里? 在此处输入图像描述

这是我用于过滤的 MATLAB 代码:

f = imread('img/crystal-grain_sample.jpg');
figure, imshow(f); title('f');

m = max(size(f));
P = 2^nextpow2(2*m);
PQ = [P, P];

Fp = fft2(f, PQ(1), PQ(2));

Fc = fftshift(Fp);
Fc_abs = abs(Fc);
Fs_log = log(1+Fc_abs);

%figure; imshow(Fc_abs, []); title('Fc (abs)');
%figure; imshow(Fs_log, []); title('Fs (log)');

Hp = im2double(imread('spec-mask.png'));
Gp = Hp .* Fp;
gp = real(ifft2(Gp));
gpc1 = gp(1:size(f,1), 1:size(f,2));
figure; imshow(gpc1, []); title('g');

这是原始图像: 在此处输入图像描述

1个回答

问题是我掩盖了移位的频谱。ifftshift在我的面膜上使用后,我获得了预期的效果。


PS。geometrikal - 感谢您让我走上正轨!