国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > php教程 > OpenCV3.0 Examples学习笔记(7)-ffilldemo.cpp

OpenCV3.0 Examples学习笔记(7)-ffilldemo.cpp

来源:程序员人生   发布时间:2017-03-08 08:18:13 阅读次数:6482次
这个系列的目的是通过对OpenCV示例,进1步了解OpenCV函数的使用,不触及具体原理。

目录
简介
Example运行截图
Example分析
Example代码

简介
本文记录了对OpenCV示例ffilldemo.cpp的分析。
资料地址:http://docs.opencv.org/3.0.0/d5/d26/ffilldemo_8cpp-example.html

这个示例主要讲述了如何使用floodFill函数,floodFill1般被译为漫水填充。

floodFill算法原理

漫水填充法基于种子填充法对选中的图象进行处理,对选中位置和与其联通并“色彩相近”的点都填充为指定色彩。


1.floodFill有3种模式判断是不是为相近色彩

(1)null range 必须完全相同

     src(seedPoint.x,seedPoint.y) == src(x,y)

(2)fixed range 满足固定浮动范围

    src(seedPoint.x,seedPoint.y)loDiffsrc(x,y)src(seedPoint.x,seedPoint.y)+upDiff

(3)floating range 满足渐变的浮动范围

    src(x,y)loDiffsrc(x,y)src(x,y)+upDiff    

以下为在相同位置,相同参数情况下,不同模式填充的情况
模式
填充效果演示
null range

fixed range

floating range


2.对灰度图象和彩色图象判断是不是为相近色彩
(1)对灰度图象,灰度值满足条件
(2)对彩色图象,需r,g,b3个通道都满足条件

3.mask的使用
很多时候可以选择先用边沿检测选取,以后再做填充,如此可以对指定的位置进行处理。

漫水填充法除用于色彩填充之外,更常见于将图象进行标记,有很多时候用来做类似连通域分析的工作。


floodFill在OpenCV中的原型
floodFill

函数原型:
int floodFill( InputOutputArray image, InputOutputArray mask,
                            Point seedPoint, Scalar newVal, CV_OUT Rect* rect=0,
                            Scalar loDiff = Scalar(), Scalar upDiff = Scalar(),
                            int flags = 4 );

参数说明:
image:
  • InputOutputArray类型的image, 输入/输出1通道或3通道,8位或浮点图象,具体参数由以后的参数具体指明。
mask:
  • InputOutputArray类型的mask,这是第2个版本的floodFill独享的参数,表示操作掩模,。它应当为单通道、8位、长和宽上都比输入图象 image 大两个像素点的图象。第2个版本的floodFill需要使用和更新掩膜,所以这个mask参数我们1定要将其准备好并填在此处。需要注意的是,漫水填充不会填充掩膜mask的非零像素区域。例如,1个边沿检测算子的输出可以用来作为掩膜,以避免填充到边沿。一样的,也能够在屡次的函数调用中使用同1个掩膜,以保证填充的区域不会堆叠。另外需要注意的是,掩膜mask会比需填充的图象大,所以 mask 中与输入图象(x,y)像素点相对应的点的坐标为(x+1,y+1)。
seedPoint:
  • Point类型的seedPoint,漫水填充算法的起始点。
newVal:
  • Scalar类型的newVal,像素点被染色的值,即在重绘区域像素的新值。
rect:
  • Rect*类型的rect,有默许值0,1个可选的参数,用于设置floodFill函数将要重绘区域的最小边界矩形区域。
loDiff :
  • Scalar类型的loDiff,有默许值Scalar( ),表示当前视察像素值与其部件邻域像素值或待加入该部件的种子像素之间的亮度或色彩之负差(lower brightness/color difference)的最大值。 
upDiff :
  • Scalar类型的upDiff,有默许值Scalar( ),表示当前视察像素值与其部件邻域像素值或待加入该部件的种子像素之间的亮度或色彩之正差(lower brightness/color difference)的最大值。
flags :
  • int类型的flags,操作标志符,此参数包括3个部份,比较复杂,我们1起详细看看。

  • 低8位(第0~7位)用于控制算法的连通性,可取4 (4为缺省值) 或 8。如果设为4,表示填充算法只斟酌当前像素水平方向和垂直方向的相邻点;如果设为 8,除上述相邻点外,还会包括对角线方向的相邻点。
  • 高8位部份(16~23位)可以为0 或以下两种选项标识符的组合:     

                                                                                    

  • FLOODFILL_FIXED_RANGE- 如果设置为这个标识符的话,就会斟酌当前像素与种子像素之间的差,否则就斟酌当前像素与其相邻像素的差。也就是说,这个范围是浮动的。
  • FLOODFILL_MASK_ONLY - 如果设置为这个标识符的话,函数不会去填充改变原始图象 (也就是疏忽第3个参数newVal), 而是去填充掩模图象(mask)。这个标识符只对第2个版本的floodFill有用,因第1个版本里面压根就没有mask参数。

  • 中间8位部份,上面关于高8位FLOODFILL_MASK_ONLY标识符中已说的很明显,需要输入符合要求的掩码。Floodfill的flags参数的中间8位的值就是用于指定填充掩码图象的值的。但如果flags中间8位的值为0,则掩码会用1来填充。

而所有flags可以用or操作符连接起来,即“|”。例如,如果想用8邻域填充,并填充固定像素值范围,填充掩码而不是填充源图象,和设填充值为38,那末输入的参数是这样:

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

floodFill

OpenCV还提供了1个不支持mask的版本,除没有mask其他都完全相同。
函数原型:
int floodFill( InputOutputArray image,
                          Point seedPoint, Scalar newVal, CV_OUT Rect* rect = 0,
                          Scalar loDiff = Scalar(), Scalar upDiff = Scalar(),
                          int flags = 4 );


Example截图
原图
处理结果
参数

loDiff = 97
upDiff = 96
ffillMode = 1Fixed Range

Example分析
1.申明需要使用的变量
Mat image0, image, gray, mask;
int ffillMode = 1;
int loDiff = 20, upDiff = 20;
int connectivity = 4;
int isColor = true;
bool useMask = false;
int newMaskVal = 255;

注意:
(1)image0保存源图象;
(2)image为处理后的图象,用于显示处理结果;
(3)gray为灰度图象,由源图象转换;
(4)mask掩膜;
(5)ffillMode 

        a. ffillMode  = 0,null range 必须完全相同

        b. ffillMode  = 1,fixed range 满足固定浮动范围

        c. ffillMode  = 2,floating range 满足渐变的浮动范围

(6)loDiff 浮动阈值

(7)upDiff浮动阈值

(8)connectivity 联通域方式

        a. connectivity  = 4,4联通

        b. connectivity  = 8,8联通

(9)isColor 是不是使用彩色模式

(10)useMask 是不是使用掩膜

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生

------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生