来客网

如何保持空域与频域滤波结果的一致性

声明:本文转载自 「老马迷图」, 或因排版与篇幅原因进行过编辑,内容未经本站独立核实,不代表本站立场、观点或建议。 如涉及版权问题,请联系我们,核实后立即删除。 [ 免责声明 ]

前一篇博文(如何保持空域与频域滤波结果的一致性)中谈到,从空域小模板转化到频域滤波时,为了保持滤波结果的一致性,需要在空域合理处理空域滤波器的边界问题,即将空域小模板的中心通过循环移位后置于补零扩充图像的左上角。然后做傅里叶变换,得到对应的频率滤波器,再与扩充后的图像在频率域与滤波器做乘法运算。具体的原理和方法可参看前述博文。

设有一幅M×N的图像f(x,y),m×n的空域滤波器为h(x,y),则频域滤波的处理步骤如下:

(1) 消除折叠现象的填充(Zero padding)。即分别对f(x,y),h(x,y)的右下部补零至P×Q得到fp(x,y)和hp (x,y),其中h(x,y)需要做循环移位,以使小模板h(x,y)的中心像素置于hp (x,y)的左上角。一般取:P=2M,Q=2N 。

(2)  fp(x,y),hp (x,y)分别做傅里叶变换产生Fp(u,v),Hp(u,v)。

(3) 中心变换(频谱中心化)。此步也可以不变换,则Hp(u,v)要改变(针对直接在频域生成对称滤波器情况)。

(4) 滤波:Hp(u,v)乘以Fp(u,v)。

(5) 傅里叶反变换。

(6) 取实数部分。绝对值很小的虚数部分是浮点运算存在误差造成的。

(7) 空间域中心还原变换(反中心化)。

(8) 截取有效数据,即左上角的原始图像尺寸M×N部分数据。

以上步骤的滤波,仅限于空域滤波的边界处理为零填充方式。如果空域滤波的边界处理为其他方式,如对称边界(''symmetric'')重复边界(''replicate'')和周期边界(''circular'')等,则依然会存在空频域滤波结果在边界上的差异性。如图1所示,是一个方差为4的25×25高斯低通滤波器对cameraman图像的分别在空域和频域滤波结果的对比。可以看出,频域滤波与空域滤波在边界上是不一致的。

文章配图

图1 仅在空域考虑了边界因素的滤波结果

那么,如何有效解决这个问题呢?其实也很简单,只要在步骤(1)和(8)上稍稍改进,就可以保持空/频域滤波结果边界上的一致性。

第(1)步,根据h(x,y)的尺寸对f(x,y)先做重复边界的扩充,在此基础上做消除折叠的零填充,即得到扩大至(P+行重复边界数)×(Q+列重复边界数)的fp(x,y)。对h(x,y)右下部补零至与fp(x,y)的相同尺寸,并循环移位后得到hp (x,y)。

第(8)步,截取有效数据时,应除去左上角单边边界数后的原始图像尺寸(M×N)部分数据。其他步骤不变,即可得到与空域滤波完全一致的结果,如图2所示。

文章配图

图2 空频域等效边界模式的滤波结果

参考代码如下:

%====================================================================

inimg = imread(''cameraman.tif'');

subplot(131)

imshow(inimg),title(''Original image'')

[M,N] =size(inimg);              % Original image size

%====================================================================

h = fspecial(''gaussian'',25,4);        % Gaussian filter

%====================================================================

% 空域滤波

gx =imfilter(inimg,h,''same'',''replicate'');

subplot(132)

imshow(gx,[]);title(''Spatial domain filtering'')

%====================================================================

%    频域滤波

%====================================================================

hf_h =floor(size(h)/2);               % 空域滤波器中心位置

imgp =padarray(inimg,[hf_h(1),hf_h(2)],''replicate''); % Padding image

% PQ =paddedsize(size(imgp));

PQ  =2* size(imgp);

Fp =fft2(double(imgp), PQ(1), PQ(2));         % 延拓图像FFT

% h  = rot90(h,2);                        % mask旋转180度,频域乘积对应空域卷积,而空域滤波为相关。对称h无需此步骤。

P = PQ(1); Q =PQ(2);

center_h =hf_h+1;                       % 空域小模板h中心位置

hp =zeros(P,Q);                            % 预分配内存,产生P×Q零矩阵

hp(1:size(h,1),1:size(h,2)) = h;   % h置于hp左上角

hp =circshift(hp,[-(center_h(1)-1),-(center_h(2)-1)]);  % 循环移位,h中心置于hp左上角

%====================================================================

Hp =fft2(double(hp));                 % 对Hp滤波器做FFT

%====================================================================

Gp = Hp.*Fp;                               %  频域滤波

gp =real(ifft2(Gp));                     % 反变换,取实部

gf = gp(hf_h(1)+1:M+ hf_h(1),hf_h(2)+1:N + hf_h(2));  % 截取有效数据

subplot(133)

imshow(uint8(gf),[]),title(''Frequency domain filtering'')

% 注:以上处理中,频域图像Fp与滤波器Hp均未中心化,因此,返回空域时无需反中心化。

评论 (0)