Opencv floodFill:如何从图像转换到蒙版坐标?

时间:2015-04-01 14:20:45

标签: c++ opencv image-processing flood-fill

我在我的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)。我错了吗?

1 个答案:

答案 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邻域,则考虑因素是相同的。