这些天我正在研究图像处理,我是这个主题的初学者。我陷入了卷积的问题以及如何为图像实现它。让我简要介绍一下这样的图像卷积的通用公式:
x(n1,n2)
表示输出图像中的一个像素,但我不知道k1
和k2
代表什么。实际上,这是想要学习的东西。为了在某种编程语言中实现这一点,我需要知道k1
和k2
代表什么。有人可以向我解释这个或者引导我写一篇文章吗?我真的很感激任何帮助。
答案 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列找到输出,那么将有五个掩码超出界限的位置。有很多方法可以解决这个问题。有些人认为外面的像素为零。其他人喜欢复制图像边框,以便将边框像素复制到图像尺寸之外。有些人喜欢使用更复杂的技术来填充图像,例如进行对称填充,其中边框像素是图像内部的镜像反射,或者是从图像的另一侧复制边框像素的圆形填充
这超出了本文的范围,但在您的情况下,从最简单的情况开始,当您收集邻域时,超出图像范围的任何像素,将其设置为零
现在,k1
和k2
是什么意思? k1
和k2
表示相对于邻域和掩码中心的偏移。请注意,n1 - k1
和n2 - k2
在总和中很重要。输出位置由n1
和n2
表示。因此,n1 - k1
和n2 - 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