与未填充内核的卷积

Convolution with unpadded kernel

假设,我有一个大小为 512x256 的图像。如果我将其转换为二维复数数组以应用 FFT,则数组的大小仍为 512x256。现在,如果我的内核大小是 10x10 并且如果我将它转换为二维复数数组,它的大小仍然是 10x10。不是这样吗?

如果是这样,我们为什么不创建一个大小为 512x256 的核并直接对图像进行卷积(而不是创建一个大小为 10x10 并填充它)?

假设我有一张 512x256 像素的图像。

如果

,输出会有什么不同
  1. 我准备了一个大小为 512x256 的内核并对图像进行卷积?
  2. 我准备了一个大小为 256x256 的内核,对其进行填充使其成为 512x256 然后对图像进行卷积?
  3. 我准备了一个大小为 256x256 的内核,填充它使其大小为 (512+256) X (256+256),填充图像使其成为相同大小然后对它们进行卷积?

在小内核大小(尤其是在低维度)上应用它们 "directly" 而不使用 FFT 可以更有效,但在更大的问题上利用 Convolution Theorem is very beneficial. Also FFTW 在各种硬件上都有很好的性能.

自然地,要进行逐点乘法,您的矩阵必须具有相同的形状。因此 10 x 10 内核用零填充以获得所需的大小,计算内核和图像的 FFT,完成逐元素乘积,IFFT 得到我们想要的结果。

我对你的内核 "preparation" 进程有点困惑,不确定 "generating 512 x 256 kernel" 与 "generating 256 x 256 kernel and padding it" 有何不同。

但是例如,如果您使用 "radius" 为 150 像素的高斯内核,那么您会得到边界效应,因为它没有足够的 "space" 衰减到大约为零.在 512 x 256 内核上,它将有足够的水平 space 衰减到 exp(-((512 / 2) / 150)^2) = 0.0543...,但垂直它将被限制在 exp(-((256 / 2) / 150)^2) = 0.4827...,显着大于零。

编辑:回到家所以可以使用 Matlab 创建示例图像。此模糊的半径为 80 像素,但即使这样也会在填充内核的 FFT 结果上造成明显的伪影。

f = @(i) fftshift(mat2gray(log(1 + abs(fft2(i)))))
[x y] = meshgrid((1:512)-256, (1:256)-128); z = zeros(256, 128);
i1 = exp(-(x.^2+y.^2)/80^2); i2=[z i1(:,129:(256+128)) z];
imshow([i1 f(i1); i2 f(i2)], 'border', 'tight')

Suppose, I have an Image of size 512x256. If I convert it into a 2D complex array to apply FFT, the size of the array would still be 512x256. Now, if the size of my kernel is 10x10 and if I convert it to a 2D complex array, its size would still be 10x10. Isn't that so?

这取决于你对尺寸的理解:

  • 如果尺寸是图像的概念维度,答案是肯定的。
  • 如果size是记忆中的space,答案是否定的
  • 如果你在谈论数学维度,答案是否定的。

If that is so, Why don't we create a kernel of size 512x256 and convolve the image directly (rather than creating a kernel of size 10x10 and pad it)?

内核大小:内核本质上:“在图像处理中,内核、卷积矩阵或掩码是用于模糊、锐化、浮雕、边缘检测...的小矩阵”(Wikipedia)。内核的想法是你有一个在图像上本地工作的数学运算符。这意味着图像中的每个像素仅受周围像素的影响。该邻域的大小就是内核的大小,在您的情况下为 10x10。

填充和卷积:将内核应用于图像,有两种方法:

  1. 直接卷积:将图像与内核进行卷积,两者都具有原始大小。你会得到一个 (512 + 10 -1) x (256 + 10 -1) 的图像,你必须裁剪它以保持尺寸。

  2. Convolution via FFT:计算图像的FFT(512x256复矩阵);计算填充内核的 FFT(512x256 复矩阵);将两个矩阵逐个元素相乘,最后计算结果的IFFT得到卷积。

通过 FFT 进行卷积计算效率更高。

What would be the difference in the output if,

  1. I prepare a kernel of size 512x256 and convolve the Image?

  2. I prepare a kernel of size 256x256, pad that to make it 512x256 and then convolve the Image?

  3. I prepare a kernel of size 256x256, pad that to make it of size (512+256) X (256+256), pad the image to make it of the same size and then convolve them?

这三个选项可能都不是您想要的。您希望保持内核较小 (10x10)。只有在通过 FFT 进行卷积时才填充它。

我建议首先使用原始 10x10 内核的直接卷积方法。检查生成的图像并检查它是否符合您的预期。 如果您随后想优化执行时间,请使用 FFT 方法。