Convolution with Image Filter && Convolution with fft/ifft

February 4, 2021
机器学习

我们可以使用傅立叶变换实现卷积,具体做法大概就是先对数据和卷积核进行傅立叶变换将数据变换到频域,然后卷积就是频域上的乘积, 最后做逆傅立叶变换转化回原来的空域。

r = ifft(fft(x).*fft(h))

但是需要注意的是傅立叶变换做的卷积对应的是Circular Convolution

g = conv2(f,h,'same');
g_fft2 = ifft2(fft2(circshift(f,[-1,-1])).*fft2(rot90(h,2),2,4));

使用傅立叶变换如果要获得和Circular Convolution一模一样的结果,需要对数据做一个shift,shift的大小和卷积核大小有关,二维情况就是[-w/2, -h/2];然后卷积核也要反转一下,因为conv2卷积是倒着的。