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文档中的术语“有效”、“相同大小”和“完全”卷积,但我不确定这是否是标准术语)。其思想是,求和既可以执行,也可以执行
- 仅在内核完全位于图像内部的源图像像素上。在这种情况下,结果小于源图像
- 在每个源像素上。在这种情况下,结果与源图像的大小相同。这需要在边界处填充
- 在内核的任何部分位于源图像内的每个像素上。在这种情况下,结果图像比源图像大。这也需要在边界处填充
带有设置填充->无,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