凡使用FFTW图像卷积时居中内核?(Where to center the kernel when

2019-07-30 03:12发布

我试图使用FFTW图像卷积。

起初只是为了测试系统是否工作正常,我执行FFT,然后逆FFT,并能得到完全相同的图像返回。

然后小一步,我使用的标识内核(即,内核[0] [0] = 1,而所有其它组件等于0)。 我把图像和内核(无论是在频域)之间的分量之积,然后做逆FFT。 从理论上讲,我应该能够得到相同的图像了。 但我得到的结果是非常甚至还没有接近原始图像。 我怀疑这事做与在我中心我的内核之前,我FFT成频域(因为我把“1”内核[0] [0],它的基本含义是我中心的积极作用在顶部剩下)。 谁能赐教什么这里出了问题?

Answer 1:

对于每个维度,样本的索引应该是从-π/ 2 ... 0 ... N / 2 -1,所以如果尺寸是奇数,围在中间中心。 如果尺寸均匀,中心,使新前0你有比新0经过一个样本。

例如-4,-3,-2,-1,0,1,2,3的8或-3的宽度/高度,-2,-1,0,1,2,3的宽度/高度7。

FFT是相对中,在其规模有负分。
在存储器中的点是0 ... N-1,但FFT将它们视为-ceil(N / 2)...地板(N / 2),其中0是-ceil(N / 2)和正图1是地板(N / 2)

单位矩阵是在0,0位置与1个零的矩阵(中心-根据上述编号)。 (在空间域。)

在频域中的单位矩阵应该是一个常数(所有实数值1或1 /(N * M)和所有虚值0)。

如果您没有收到这样的结果,那么识别矩阵可能需要不同的填充(向左和向下的,而不是周围的所有边) - 这可能取决于FFT的实现。

分别中心中的每个尺寸 (这是一个指数定心,在实际的存储器中没有变化)。

你可能会需要垫图像 (居中后)为2的整体功率在每一个维度(2 ^ N * 2 ^ M,其中n不必相等米)。

相对垫FFT的0,0位置(到中心,而不是角部)通过在源和目标图像(现有像素复制到一个新的较大的图像,使用基于中心的索引例如(0,0)到(0,0) ,(0,1)至(0,1),(1,-2)到(1,-2))

假设你的FFT使用常规的浮点单元,而不是复杂的细胞复杂的图像必须是尺寸2 *小区(2 / N)* 2 *小区(2 / M),即使你并不需要2的整体功率(因为它有一半的样品,但样品是复杂的)。

如果你的形象有一个以上的颜色通道 ,您首先必须重塑它,这样的通道是在子像素排序最显著,而不是最显著。 您可以在一个去重塑和垫,以节省时间和空间。

不要忘了IFFT后FFTSHIFT。 (要交换象限。)
IFFT的结果是0,...,N-1。 你必须采取像素地板(N / 2)+ 1..N-1和0之前移动它们...地板(N / 2)。
这是通过复制像素到一个新的图像,复制地板(N / 2)+1至存储器位置0,地板进行(N / 2)2到存储器位置1,...,N-1到MEMORY-位置地板(N / 2),然后0至存储器位置小区(N / 2),1至存储器位置小区(N / 2)+1,...,地板(N / 2)到存储器地址n -1。

当你在频域相乘 ,记得样品是复杂的(一个细胞真正一个小区虚构的),所以你必须使用一个复杂的乘法。

结果可能需要通过N ^ 2 * M ^ 2,其中N是正的填充之后(并且同样地用于M和M)的大小除以。 - 你可以告诉这(一看单位矩阵的频域的值,B比较结果输入。)



Answer 2:

我认为你的身份内核的理解可能会关闭。 身份内核应该有1在2D的中心籽粒不能在0,0位置。

例如,对于一个3×3,你有你的设置如下:

1, 0, 0
0, 0, 0
0, 0, 0

它应该是

0, 0, 0
0, 1, 0
0, 0, 0

检查了这一点还

什么是“什么也不做”卷积核

也看这里,第3页的底部。

http://www.fmwconcepts.com/imagemagick/digital_image_filtering.pdf



Answer 3:

我接过分量之积的图像和内核之间在频域,然后做逆FFT。 从理论上讲,我应该能够得到相同的图像了。

我不认为这样做正向与非FFT变换的内核,再逆FFT变换应该导致得到原始图像回任何期待,但也许我只是误解你试图说有。 ..



文章来源: Where to center the kernel when using FFTW for image convolution?