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);