对于傅里叶变换我们都知道时域的卷积为频域的乘积,但是对于离散傅里叶变换来说就存在选取区间的问题,这时使用循环卷积。稍微了解一些循环卷积知道该定理依然满足时域卷积频域相乘,但是选取区间是一个重要问题,至少是一个需要注意的问题。



文章目录

  • 问题
  • 一、一维情况验证
  • 二、二维情况



问题

在实现图像卷积之后傅里叶变换计算的时候遇到了需要分开运算的问题,分别运算卷积图和卷积核傅里叶变换,但是二者不一样大,使用psf2otf函数,对于其具体的运作原理不是很了解。于是做了相关的验证。

一、一维情况验证

a = [1,2,0,3,1];
b = [0,1,0,2,0];
c = imfilter(a,b,'circular','conv'); % 循环卷积,取卷积核中心主值时的取值cconv(a,ifftshift(b),5)
A = fft(a);
B = psf2otf(b,[1,5]); %等价于fft(ifftshift(b))
AB = A.*B;
C = fft(c);

两个一维的向量进行卷积,正常的我们常用的卷积,就是将卷积核翻转之后,从第一个数值开始滑动来得到结果,但是一般我们在图像上卷积时,是将卷积核的中心在被卷积的图像上计算得到的值。其中imfilter函数就是这个功能。从计算上来说,就是将卷积核的中心放在最前面,然后根据循环的规则在后面递补,b就变成了[0,2,0,0,1]
这里说明一下为什么将b写成这个形式,是因为循环卷积要求两个向量大小相等,大家可以考虑一些为什么是这样(简单说一些我的理解,这里我写了cconv(a,ifftshift(b),5)等价于imfilter(···),这里面涉及到了一个ifftshift(对于fftshift和ifftshift的区别可以去了解一些,这里只是刚好这个函数达到了这么一些要求,也可以用circshift函数取调整),如果大小不相等的话,就没法个原来的数据对上,算出来的结果不是原来的结果)

这里捋一下,我们的被卷积的向量a,假定a的区间是主值区间,后面所有的值就要与a的区间对应,对于卷积核b来说就是中心调整到最前面,得到的卷积之后的值选取的是主值区间时的值。下面开始考虑傅里叶变换,要一一对应,a的傅里叶变换F(a)乘以调整之后的b的傅里叶变换F(b)等于卷积之后python2维傅里叶变换 二维傅里叶变换卷积_python2维傅里叶变换的傅里叶变化F(c)

对于psf2otf函数来说
原理上是由于在循环卷积是,取得是主值区间(也就是卷积核的中心在被卷积的区间时的取值),也就是将卷积核的中心移动到前面,这时候卷积就从最前面开始,就和我们理解的卷积相同了,这里同时也说明了psf2otf的原理了,首先,点扩散函数在空间作用的过程本省就是一个卷积的过程,这时的卷积就是去主值区间的值,因此和这里面的作用也就相同了,在傅里叶变换的也就需要将卷积核移动到左上角处理了。

二、二维情况

%% 用二维来验证
i = [1,2,3,4,5,6,7;
	2,2,2,2,2,2,2;
	3,3,4,5,6,7,8];sizei = size(i);
h = fspecial('average',[3,3]);
o = imfilter(i,h,'circular','conv');
I = fft2(i);
H = psf2otf(h,sizei);
IH = I.*H;
O = fft2(o);