初学图像处理:为什么频域滤波在做傅里叶变换时,要补0

1. 在做卷积时,没有值的地方需要填0,而在matlab中,conv和conv2函数会自动填0.

2. 在频域滤波时,根据冈萨雷兹的《数字图像处理》,在频率域滤波需要先对原始图像f(x,y)填0,然后再进行傅里叶变换。这主要是因为傅里叶变换离散和周期的对应关系。

下面是实验 初始矩阵记作m

1 2 3
4 5 6

7 8 9

对m卷积 m*m

1 4 10 12 9
8 26 56 54 36
30 84 165 144 90
56 134 236 186 108

49 112 190 144 81

就是在没有值的地方,matlab会自动补0

将m进行傅里叶变换成M,再作M.*M,(array间的点乘),然后再作傅里叶逆变换

255 255 246
255 255 246

174 174 165

这个结果实际上可以这样得到 设矩阵m_periodic为

m m m

m m m

m m m

将这个矩阵对m卷积,然后选出中间位置的m,结果就是

255 255 246
255 255 246

174 174 165

所以这个实验清楚的显示了对一组离散数据傅里叶变换的时候,实际上这组数据在傅里叶变换中是周期的。

而如果补0,即将m改成

1 2 3 0 0 0
4 5 6 0 0 0
7 8 9 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0

0 0 0 0 0 0

经过傅里叶变换,点乘,逆变换,就能得到

    1.0000    4.0000   10.0000   12.0000    9.0000    0.0000
    8.0000   26.0000   56.0000   54.0000   36.0000    0.0000
   30.0000   84.0000  165.0000  144.0000   90.0000   -0.0000
   56.0000  134.0000  236.0000  186.0000  108.0000    0.0000
   49.0000  112.0000  190.0000  144.0000   81.0000         0

    0.0000    0.0000    0.0000    0.0000    0.0000    0.0000

前五行五列就是 时域里卷积结果

以下是matlab里的运行代码

m=[1 2 3; 4 5 6;7 8 9];
m_conv=conv2(m,m);
M=fft2(m);
H=M.*M;
m_conv_periodic=ifft2(H);
m_pad=[1 2 3 0 0 0;4 5 6 0 0 0;7 8 9 0 0 0;0 0 0 0 0 0; 0 0 0 0 0 0;0 0 0 0 0 0];
M_pad=fft2(m_pad);
H_pad=M_pad.*M_pad;
m_conv_pad=ifft2(H_pad);
m_periodic=[m m m;m m m;m m m];
m_periodic_conv=conv2(m_periodic,m);
m_cut=m_periodic_conv(4:6,4:6);


猜你喜欢

转载自blog.csdn.net/weixin_40883324/article/details/80239403