FloodFill泛洪填充是很多图像绘制软件中常用的填充算法,通常来说是自动选中与种子像素相关的区域。利用指定的颜色进行区域颜色替换,可用于标记或者分离图像的某些部分。Windows的图像编辑软件中的油漆桶和PS中的魔术棒选择,都是通过泛洪填充来改进和延伸。
FloodFill算法的原理很简单,就是从一个点开始遍历附件像素点,填充成新的颜色,直到封闭区域内的所有像素点都被填充成新的颜色。实现方法最常见的有4-邻域像素填充法,8-邻域像素填充法,基于扫描线的像素方法等。
OpenCV提供了泛洪填充的函数:
int floodFill(InputOutputArray image,Point seedPoint,Scalar newVal,Rect* rect=0,Scalar loDiff=Scalar(),Scalar upDiff=Scalar(),int flags=4)
int floodFill(InputOutputArray image,InputOutpuyArray mask,Point seedPoint,Scalar newVal,Rect* rect=0,Scalar loDiff=Scalar(),Scalar upDiff=Scalar(),int flags=4)
用指定颜色填充一个连通域。参数image为输入图像,1或3通道,8bit或浮点型数据,输入的图像将会因为被函数操作而修改;如果想保留原图则使用CV_FLOODFILL_MASK_ONLY;mask为更新的掩码;seedPoint为种子点开始位置;newVal为新的重新绘制的像素值;loDiff为当前观察像素值与其部件领域像素或者待加入该部件的种子像素之负差的最大值;upDIff为当前观察像素值与其部件领域像素或者加入该部件的种子像素之正差的最大值;flag为操作选项标志位,低位比特包括连通值,4(默认)或8,在函数执行连通过程中确定使用拿着邻域方式。高位比特位可以选择0或下面的开关选项的组合。如果设置CV_FLOODFILL_FIXED_RANGE为当前选项,则考虑当前像素与种子像素之差,否则考虑当前像素与邻域像素之差,如果设置CV_FLOODFILL_MASK_ONLY为当前选项,函数不填充原始图像,但填充掩膜图像。
floodfill区域填充适用于对内定义区域的种子进行填充,区域内部所有像素具有同一的颜色或亮度,外部区域外所有的像素指表现出不同的特征。利用floodfill可将该区域的像素值都设置为另一新值,并通过特定规则来实现区域内点中连通域,从而实现对相似区域进行填充,直到找到区域内所有像素或边界轮廓。