【问题标题】:Convolution with unpadded kernel与未填充内核的卷积
【发布时间】:2016-08-23 22:46:38
【问题描述】:

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

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

假设,我有一个大小为512x256 像素的图像。

如果,输出会有什么不同,

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

【问题讨论】:

  • 如果你只是用零填充内核,应该没有任何区别。所以不要那样做。但是我有点担心你认为图像卷积核与要处理的图像的大小有关。通常的内核非常小,例如 10x10 左右。您是在谈论使用矩阵的卷积吗?
  • But I am a bit worried that you think a image convolution kernel is related in size to the image to be processed. --- 假设,我有一个大小为512x256 的图像。如果我将该图像转换为二维复数数组以应用 FFT,则数组的大小仍为512x256。现在,如果我的内核大小是10x10,并且如果我将它转换为二维复数数组,它的大小仍然是10x10。不是这样吗?如果是这样,我怎样才能将它们相互卷积?在这种情况下,我想,我需要填充内核或两者。我说的对吗?
  • 啊,对不起,我对这里的术语感到困惑。我对基于 fft 的卷积没有任何有用的帮助。也许这可以帮助:stackoverflow.com/questions/14328502/filtering-image-with-fft

标签: image-processing kernel filtering mask


【解决方案1】:

在较小的内核大小(尤其是低维度)上,“直接”应用它们而不使用 FFT 会更有效,但在较大的问题上使用 Convolution Theorem 非常有益。 FFTW 在各种硬件上也有很好的表现。

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

我对你的内核“准备”过程有点困惑,不知道“生成512 x 256 内核”与“生成256 x 256 内核并填充它”有何不同。

但是,例如,如果您使用“半径”为 150 像素的高斯核,那么您会得到边界效应,因为它没有足够的“空间”衰减到大约为零。在512 x 256 内核上,它有足够的水平空间衰减到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')

【讨论】:

    【解决方案2】:

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

    这取决于你对size的理解:

    • 如果尺寸是图像的概念维度,答案是肯定的。
    • 如果 size 是内存中的空间,答案是否定的。
    • 如果您谈论的是数学维度,答案是否定的。

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

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

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

    1. 直接卷积:将图像与内核进行卷积,两者都具有其原始大小。您将获得 (512 + 10 -1) x (256 + 10 -1) 图像,您必须对其进行裁剪以保持大小。

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

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

    如果,输出会有什么不同,

    1. 我准备了一个大小为 512x256 的内核并对图像进行卷积?

    2. 我准备了一个大小为 256x256 的内核,将其填充为 512x256,然后对图像进行卷积?

    3. 我准备了一个大小为 256x256 的内核,将其填充为 (512+256) X (256+256) 大小,将图像填充为相同大小,然后对它们进行卷积?

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

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

    【讨论】:

      猜你喜欢
      • 2020-10-10
      • 2017-10-15
      • 1970-01-01
      • 2016-12-31
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      相关资源
      最近更新 更多