【发布时间】:2017-05-23 18:14:14
【问题描述】:
我正在尝试对图像实施图像过滤内核,其中我使用过滤矩阵来过滤图像。但是,我真的不明白边界像素是如何处理的。我假设图像中任何超出边界的过滤器像素都会反映在它们各自的边缘上。谁能给我更清楚地解释一下?
谢谢!
【问题讨论】:
标签: c++ image filter convolution
我正在尝试对图像实施图像过滤内核,其中我使用过滤矩阵来过滤图像。但是,我真的不明白边界像素是如何处理的。我假设图像中任何超出边界的过滤器像素都会反映在它们各自的边缘上。谁能给我更清楚地解释一下?
谢谢!
【问题讨论】:
标签: c++ image filter convolution
嗯,有多种方法可以处理图像中的边界像素。一种常见的方法是用额外的行和列填充图像矩阵,以便为这些边界像素(内核卷积操作中需要的邻居)提供邻居。
例如,你有这个 n x n 图像矩阵:
a[0][0] a[0][1] ... a[0][n-1]
a[1][0] a[1][1] ... a[1][n-1]
. . .
. . .
. . .
a[n-1][0] a[n-1][1] ... a[n-1][n-1]
您应该通过将第一行放在第 n 行下方并将第 n 行放在第一行上方来填充它。此外,第一列复制到最后一列之后,最后一列复制到第一列之前。
a[n-1][n-1] a[n-1][0] a[n-1][1] ... a[n-1][n-1] a[n-1][0]
a[0][n-1] a[0][0] a[0][1] ... a[0][n-1] a[0][0]
a[1][n-1] a[1][0] a[1][1] ... a[1][n-1] a[1][0]
. . . . .
. . . . .
. . . . .
a[n-1][n-1] a[n-1][0] a[n-1][1] ... a[n-1][n-1] a[n-1][0]
a[0][n-1] a[0][0] a[0][1] ... a[0][n-1] a[0][0]
如您所见,角以对称方式反射。新边框的左上角取初始矩阵中右下角元素的值。
您最终会得到一个 (n+2) x (n+2) 矩阵,您可以在该矩阵上应用核卷积操作。
【讨论】:
没有答案。你可以反射边界像素,这通常是最好的选择,或者你可以包裹,如果图像是圆环状的,这更容易,有时更正确。或者你可以用灰色填充。但无论你做什么,都会产生边缘效应。
通常最简单的方法是添加填充像素,而不是尝试在卷积代码本身中保护边缘。
【讨论】: