文章目录
  1. 1. 一、floodFill思想
  2. 2. 二、函数介绍
  3. 3. 三、函数演示

一、floodFill思想

  所谓漫水填充,简单来说,就是自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色,这是个非常有用的功能,经常用来标记或者分离图像的一部分进行处理或分析.漫水填充也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或者只处理掩码指定的像素点。操作结果总是某个连续的区域。当邻近像素点位于给定的范围(从lodiff到updiff)内或在原始seedPoint像素值范围内是,floodFill将会为这个点涂上颜色。以此填充算法为基础,类似photoshop的魔术棒选择工具就很容易实现了。
  漫水填充(FloodFill)是查找和种子点联通的颜色相同的点,魔术棒选择工具则是查找和种子点联通的颜色相近的点,将和初始种子像素颜色相近的点压进栈作为新种子。
  泛红填充实现最常见有四邻域像素填充法,八邻域像素填充法,基于扫描线的像素填充方法。根据实现又可以分为递归与非递归(基于栈)。

二、函数介绍

  

floodFill ( InputOutputArray image,   //输入/输出1通道或3通道,8位或浮点图像,具体参数由之后的参数具体指明InputOutputArray mask,     
     Point seedPoint,                //漫水填充算法的起始点
     Scalar newVal,                   //像素点被染色的值,即在重绘区域像素的新值
     Scalar loDiff=Scalar(), 
     Scalar upDiff=Scalar(), 
     CvConnectedComp*  comp = NULL
     int flags=4 )

  mask:表示操作掩模,(控制被填充的区域)。它应该为单通道、8位、长和宽上都比输入图像 image 大2个像素点的图像(是内部运算简单快速)。floodFill需要使用以及更新掩膜。需要注意的是,漫水填充不会填充掩膜mask的非零像素区域。例如,一个边缘检测算子的输出可以用来作为掩膜,以防止填充到边缘。同样的,也可以在多次的函数调用中使用同一个掩膜,以保证填充的区域不会重叠。另外需要注意的是,掩膜mask会比需填充的图像大,所以mask中与输入图像(x,y)像素点相对应的点的坐标为(x+1,y+1)。
  
  lodiff、updiff:表示当前观察像素值与其部件邻域像素值或者待加入该部件的种子像素之间的亮度或颜色之负差(lower brightness/color difference)或正差的最大值。 如果一个像素点的值不低于被染色的相邻点减去lodiff且不高于其加上updiff,那么该像素点就会被染色。如果flags参数包含FLOODFILL_FIXED_RANGE 这时每个像素点都将于种子点而不是相邻点比较。可以理解成阈值范围,在这个范围里的像素都会被染色。
  
  flags:低8位(第0~7位)用于控制算法的连通性,可取4 (4为缺省值) 或者 8。如果设为4,表示填充算法只考虑当前像素水平方向和垂直方向的相邻点;如果设为 8,除上述相邻点外,还会包含对角线方向的相邻点。高8位部分(16~23位)可以为0 或者如下两种选项标识符的组合:
  (1) FLOODFILL_FIXED_RANGE-如果设置为这个标识符的话,就会考虑当前像素与种子像素之间的差,否则就考虑当前像素与其相邻像素的差。也就是说,这个范围是浮动的。
  (2)FLOODFILL_MASK_ONLY-如果设置为这个标识符的话,函数不会去填充改变原始图像 (也就是忽略第三个参数newVal),而是去填充掩模图像(mask)。中间8位部分,上面关于高八位FLOODFILL_MASK_ONLY标识符中已经说的很明显,需要输入符合要求的掩码。Floodfill的flags参数的中间八位的值就是用于指定填充掩码图像的值的。但如果flags中间八位的值为0,则掩码会用1来填充。
  而所有flags可以用or操作符连接起来,即“|”。例如,如果想用8邻域填充,并填充固定像素值范围,填充掩码而不是填充源图像,以及设填充值为47,那么输入的参数是这样:

flags=8 | FLOODFILL_MASK_ONLY | FLOODFILL_FIXED_RANGE | (47<<8)

三、函数演示

待写ing……

文章目录
  1. 1. 一、floodFill思想
  2. 2. 二、函数介绍
  3. 3. 三、函数演示