我在我的Android应用程序上使用floodFill
。 Opencv floodfill函数更改了掩码输入图像。
public static int floodFill(Mat image,
Mat mask,
Point seedPoint,
Scalar newVal,
Rect rect,
Scalar loDiff,
Scalar upDiff,
int flags)
我从here读了这个函数用法。文档说明
操作掩码,应为单通道8位图像,宽2像素,比图像高2像素。
和
注意:由于蒙版大于填充图像,因此图像中的像素(x,y)对应于蒙版中的像素(x + 1,y + 1)。
但我认为,如果我想访问(x,y),我会使用(x + 2,y + 2)。我错了吗?
答案 0 :(得分:1)
你应该信任这些文件! (好吧,大部分时间...... :-)
Mask比输入图像宽2像素,但在图像的顶部/左侧使用一条像素,在图像的底部/右侧使用另一条像素。
正如您所说,在填充过程中,所有inputImage坐标都通过求和(1,1)转换为蒙版坐标。
例如,当到达位于坐标x = 0, y = y0
的图像左边缘的任何点时,算法将在掩模中检查以坐标x = 1, y = y0 + 1
为中心的8个点,其中包括点x = 0, y = y0 + 1
(紧邻左侧)。如果你没有加1,你就会退出图像边界。
当到达位于坐标x = inputImage.cols -1, y = y0
的图像的右边缘时,算法将在掩模中检查以坐标x = inputImage.cols, y = y0 + 1
为中心的8个点,其中包括点x = inputImage.cols + 1, y = y0 + 1
(在右边)。如果您的蒙版不比原始图像宽2个像素,则您将退出图像边界。
这就是为什么你需要一个比输入图像宽2个像素的掩模图像,同时求和(1,1)从图像转换到掩模坐标。
所有这些注意事项当然对y
坐标有效,以解释为什么掩码必须比输入图像高2个像素。
注意:如果您使用4邻域而不是8邻域,则考虑因素是相同的。