src(seedPoint.x,seedPoint.y)b−loDiffb≤src(x,y)b≤src(seedPoint.x,seedPoint.y)b+upDiffb\texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_b- \texttt{loDiff} _b \leq \texttt{src} (x,y)_b \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_b+ \texttt{upDiff} _bsrc(seedPoint.x,seedPoint.y)b−loDiffb≤src(x,y)b≤src(seedPoint.x,seedPoint.y)b+upDiffb
上述公式中,src(x′,y′)
表示该区域内已知的相邻像素的值。简言之,当为浮动范围时,只有和已经属于某区域内的邻域相差足够小(满足公式范围),才能被选中进入该区域;当为固定范围时,只需要和种子像素相差足够小,就可以被选中进入该区域。
API
public static int floodFill(Mat image, Mat mask, Point seedPoint, Scalar newVal, Rect rect, Scalar loDiff, Scalar upDiff, int flags)
-
返回值:填充像素数目。
-
参数一:image,输入和输出图像,图像可以为CV_8U或者CV_32F类型的单通道或者三通道图像。当最后一个参数设置为FLOODFILL_MASK_ONLY标志时,不改变原始图像。
-
参数二:mask,操作掩码,为单通道8位图像,比输入图像宽2像素,高2像素。由于mask既是输入参数又是输出参数,必须初始化。漫水填充不会填充掩码中的非零区域。例如,边缘检测的输出可以用作操作掩码来防止漫水填充边缘。
-
参数三:seedPoint,种子点。
-
参数四:newVal,重新绘制的域像素的新值。
-
参数五:rect,默认为 0,用于设置 floodFill 函数将要重绘的最小边界矩形区域,即若漫水填充区域 < rect,则不进行填充。
-
参数六:loDiff,添加进种子点区域条件的下界差值。表示当前观察像素值与其邻域像素值或待加入的种子像素值之间的亮度或颜色的最大负差。
-
参数七:upDiff,添加进种子点区域条件的上界差值。表示当前观察像素值与其邻域像素值或待加入的种子像素值之间的亮度或颜色的最大正差。
-
参数八:flags,漫水填充法的操作标志位。该标志由3部分组成,第一部分表示邻域的种类,4邻域或者8邻域;第二部分表示掩码矩阵中被填充像素点的新像素值;第三部分是填充算法的规则标志。int 类型操作标识符,默认值为 4,一共 23 位。
-
低八位(0~7):用于控制算法的连通性,可取 4(默认值)或 8。如果设为 4,表示填充算法只考虑当前像素水平或处置方向的相邻点,如果设为 8,除上述相邻点外,还会包含对角线方向的相邻点。