Image processing 卷积理论与实现

Image processing 卷积理论与实现,image-processing,convolution,Image Processing,Convolution,我学习图像处理中的卷积,因为它是课程的一部分,我理解其理论和公式,但对其实现感到困惑 公式是: 我所理解的 将卷积核水平和垂直翻转,然后将核中的值乘以相应的像素值,将结果相加,除以“rowxcolumn”得到平均值,最后此结果是位于核位置中心的像素值 实施中的混乱 当我从课程材料中运行示例卷积程序并插入3x3卷积内核作为输入时,其中: 第一行:(0,1,0) 第二行:(0,0,0) 第三行:(0,0,0) 处理后的图像向下移动了一个像素,我希望它向上移动一个像素。该结果表明,在计算之前没有

我学习图像处理中的卷积,因为它是课程的一部分,我理解其理论和公式,但对其实现感到困惑

公式是:



我所理解的

将卷积核水平和垂直翻转,然后将核中的值乘以相应的像素值,将结果相加,除以“rowxcolumn”得到平均值,最后此结果是位于核位置中心的像素值

实施中的混乱

当我从课程材料中运行示例卷积程序并插入3x3卷积内核作为输入时,其中:

第一行:(0,1,0)

第二行:(0,0,0)

第三行:(0,0,0)

处理后的图像向下移动了一个像素,我希望它向上移动一个像素。该结果表明,在计算之前没有进行水平或垂直翻转(就像进行关联一样)

我认为程序中可能有错误,所以我环顾四周,发现了这一点,并且也在这样做

我不明白,有什么我没注意到的吗

感谢您的帮助或反馈。

请注意:

结果:


因此,“移位”是不真实的,因为维度受到影响。

我猜您尝试的程序实现的是相关性而不是卷积

我已经在Mathematica中使用
ImageFilter
函数尝试了您的过滤器,结果按预期上移:

结果:

我也在Octave(一个开源的Matlab克隆)中尝试过:

(“conv”表示卷积-
imfilter
的默认值是相关性)。结果:

请注意,最后一行是不同的。这是因为不同的实现使用不同的填充(默认情况下)。Mathematica对
图像卷积
使用常量填充,而对
列表卷积
不使用填充。倍频程的imfilter使用零填充

还要注意(正如belisarius提到的)卷积的结果可以比源图像更小、相同大小或更大。(我已经阅读了Matlab和IPPI文档中的术语“有效”、“相同大小”和“完全”卷积,但我不确定这是否是标准术语)。其思想是,求和既可以执行,也可以执行

  • 仅在内核完全位于图像内部的源图像像素上。在这种情况下,结果小于源图像
  • 在每个源像素上。在这种情况下,结果与源图像的大小相同。这需要在边界处填充
  • 在内核的任何部分位于源图像内的每个像素上。在这种情况下,结果图像比源图像大。这也需要在边界处填充

我从未听说过在卷积之前内核会被翻转。也许所有的程序都假设您提供了一个预翻转的内核。还请记住,结果的维数减少了内核的维数1@Tom安德森:真的吗?我一直认为镜像是卷积和相关性之间的唯一区别。@nikie这是真的,它的优点是它使卷积具有关联性,从而节省了计算能力。我不确定我是否明白你的意思。如果使用ImageConvolve,则移位将非常真实。@nikie ImageConvolve默认使用固定的填充。这隐藏了图像收缩的“问题”,但也让你相信卷积在“移动”像素。不是,我还是不明白。如果我使用3x3标识内核{0,0,0},{0,1,0},{0,0,0}执行卷积而不填充,并将其与您发布的结果进行比较,它会明显向上移动,正如预期的那样。(顺便说一句:我不认为问题真的是关于“像素移位”,而是内核是否“镜像”。移位内核可能不是最好的例子。)在Mathematica帮助页面:
带有设置填充->无,ImageFilter[f,image,\[Ellipsis]]通常给出的图像比图像小。
imfilter([1,1,1,1,1;
          2,2,2,2,2;
          3,3,3,3,3;
          4,4,4,4,4;
          5,5,5,5,5],
         [0,1,0;
          0,0,0;
          0,0,0],"conv")
   2   2   2   2   2
   3   3   3   3   3
   4   4   4   4   4
   5   5   5   5   5
   0   0   0   0   0