图像的2D卷积如何工作?

时间:2015-04-21 09:50:58

标签: image image-processing signal-processing

这些天我正在研究图像处理,我是这个主题的初学者。我陷入了卷积的问题以及如何为图像实现它。让我简要介绍一下这样的图像卷积的通用公式:

Convolution Formula

x(n1,n2)表示输出图像中的一个像素,但我不知道k1k2代表什么。实际上,这是想要学习的东西。为了在某​​种编程语言中实现这一点,我需要知道k1k2代表什么。有人可以向我解释这个或者引导我写一篇文章吗?我真的很感激任何帮助。

2 个答案:

答案 0 :(得分:4)

在这种情况下,卷积处理提取出围绕目标图像像素的图像像素的片。当您执行图像卷积时,使用所谓的掩码点扩散函数内核执行此操作,这通常比图像本身的大小。

对于输出图像中的每个目标图像像素,您可以从输入中获取像素值的邻域,包括输入中位于相同目标坐标的像素。该邻域的大小与掩模的大小完全相同。此时,您旋转遮罩使其达到180度,然后对遮罩中每个值进行逐个元素的乘法,并在每个位置重合像素值。邻居。您可以添加所有这些,这是目标图像中目标像素的输出。

例如,我们说我有这个小图片:

1   2   3   4   5
6   7   8   9  10
11  12 13  14  15
16  17 18  19  20
21  22 23  24  25

让我们说我想在3 x 3的窗口内进行平均,所以我的面具都是:

    [1  1  1]
1/9*[1  1  1]
    [1  1  1]

要执行2D图像卷积,将遮罩旋转180度仍然会给我们提供相同的遮罩,所以我想说我想在第2行第2列找到输出。我想要3 x 3的邻域提取物是:

1  2  3
6  7  8
11 12 13

要查找输出,我会将掩码中的每个值乘以邻域的相同位置:

[1  2  3 ]           [1 1 1]
[6  7  8 ]  ** (1/9)*[1 1 1]
[11 12 13]           [1 1 1]

执行逐点乘法,并添加值将给我们:

1(1/9) + 2(1/9) + 3(1/9) + 6(1/9) + 7(1/9) + 8(1/9) + 11(1/9) + 12(1/9) + 13(1/9) = 63/9 = 7

输出图像中位置(2,2)的输出为7。

请记住,我并没有解决面具超出范围的情况。具体来说,如果我试图在第1行,第1列找到输出,那么将有五个掩码超出界限的位置。有很多方法可以解决这个问题。有些人认为外面的像素为零。其他人喜欢复制图像边框,以便将边框像素复制到图像尺寸之外。有些人喜欢使用更复杂的技术来填充图像,例如进行对称填充,其中边框像素是图像内部的镜像反射,或者是从图像的另一侧复制边框像素的圆形填充

这超出了本文的范围,但在您的情况下,从最简单的情况开始,当您收集邻域时,超出图像范围的任何像素,将其设置为零


现在,k1k2是什么意思? k1k2表示相对于邻域和掩码中心的偏移。请注意,n1 - k1n2 - k2在总和中很重要。输出位置由n1n2表示。因此,n1 - k1n2 - k2是水平意义n1 - k1和垂直感n2 - k2中相对于此中心的偏移。如果我们有3 x 3掩码,则中心为k1 = k2 = 0。左上角是k1 = k2 = -1。右下角是k1 = k2 = 1。他们之所以走向无限,是因为我们需要确保覆盖掩码中的所有元素。面具的尺寸是有限的,这样才能确保我们覆盖所有面具元素。因此,上述总和简化为我之前讨论的逐点总结。


这里有一个更好的例子,其中蒙版是垂直索贝尔滤镜,可以在图像中找到垂直渐变:

来源:http://blog.saush.com/2011/04/20/edge-detection-with-the-sobel-operator-in-ruby/

如您所见,对于目标图像中的每个输出像素,我们看一下输入图像中相同空间位置的像素邻域,在这种情况下,我们看到的是3 x 3,我们通过掩模和邻域之间的元素和执行加权元素,并且我们将输出像素设置为这些加权元素的总和。请记住,此示例不会将遮罩旋转180度,但这就是卷积时的操作。


希望这有帮助!

答案 1 :(得分:0)

$ k_1 $和$ k_2 $是应该覆盖内核整个定义区域的变量。 查看维基百科以获取更多描述: http://en.wikipedia.org/wiki/Kernel_%28image_processing%29