定义 :

漫水填充算法是一种用特定颜色填充连通区域,通过设置像素上下限及连通方式来达到不同的连通效果。漫水填充经常用来标记或分离图像的一部分,以便于对其进行进一步的处理和分析。也可以从输入图像获取掩码区域,掩码会加速处理过程,或只处理掩码指定的像素点,操作的结果总是某个连续的区域。

所谓漫水填充,简单来说,就是自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色。

漫水填充算法是根据像素灰度值之间的差值寻找相同区域实现分割。我们可以将图像的灰度值理解成像素点的高度,这样一张图像可以看成崎岖不平的地面或者山区,向地面上某一个低洼的地方倾倒一定量的水,水将会掩盖低于某个高度的区域。漫水填充法利用的就是这样的原理,其形式与注水相似,因此被称形象的称为“漫水”。

与向地面注水一致,漫水填充法也需要在图像选择一个注水像素,该像素被称为种子点,种子点按照一定规则不断向外扩散,从而形成具有相似特征的独立区域,进而实现图像分割。漫水填充分割法主要分为3以下三个步骤:

  • Step1:选择种子点
  • Step2:以种子点为中心,判断4邻域或者8邻域的像素值与种子点像素值的差值,将差值小于阈值的像素点添加进区域内。
  • Step3:将新加入的像素点作为新的种子点,反复执行Step2,直到没有新的像素点被添加进该区域。

OpenCV 4提供了floodFill函数用于实现漫水填充法分割图像,该函数有两种函数原型

//简化版原型:
int cv::floodFill( InputOutputArray _image, InputOutputArray _mask,Point seedPoint,Scalar newVal, Rect* rect = 0,Scalar loDiff = Scalar(), Scalar upDiff = Scalar(), int flags = 4 )
  • 第一个参数,InputOutputArray类型的image, 输入/输出1通道或3通道,8位或浮点图像
  • 第二个参数, InputOutputArray类型的mask,这是第二个版本的floodFill独享的参数,表示操作掩模,。它应该为单通道、8位、长和宽上都比输入图像 image 大两个像素点的图像。第二个版本的floodFill需要使用以及更新掩膜,所以这个mask参数我们一定要将其准备好并填在此处。需要注意的是,漫水填充不会填充掩膜mask的非零像素区域。例如,一个边缘检测算子的输出可以用来作为掩膜,以防止填充到边缘。同样的,也可以在多次的函数调用中使用同一个掩膜,以保证填充的区域不会重叠。另外需要注意的是,掩膜mask会比需填充的图像大,所以 mask 中与输入图像(x,y)像素点相对应的点的坐标为(x+1,y+1)。
  • 第三个参数,Point类型的seedPoint种子点,漫水填充算法的起始点。
  • 第四个参数,Scalar类型的newVal,归入种子点区域内像素点的新像素值。像素点被染色的值,即在重绘区域像素的新值。
  • 第五个参数,Rect*类型的rect,有默认值0,一个可选的参数,用于设置floodFill函数将要重绘区域的最小边界矩形区域。种子点漫水填充区域的最小矩形边界,默认值为0,表示不输出边界。
  • 第六个参数,Scalar类型的loDiff,有默认值Scalar( ),表示当前观察像素值与其部件邻域像素值或者待加入该部件的种子像素之间的亮度或颜色之负差(lower brightness/color difference)的最大值。添加进种子点区域条件的下界差值,当邻域某像素点的像素值与种子点像素值的差值大于该值时,该像素点被添加进种子点所在的区域。
  • 第七个参数,Scalar类型的upDiff,有默认值Scalar( ),表示当前观察像素值与其部件邻域像素值或者待加入该部件的种子像素之间的亮度或颜色之正差(lower brightness/color difference)的最大值。添加进种子点区域条件的上界差值,当种子点像素值与邻域某像素点的像素值的差值小于该值时,该像素点被添加进种子点所在的区域。
  • 第八个参数,int类型的flags,操作标志符,此参数包含三个部分,漫水填充方法的操作标志,其由三部分构成,分别表示邻域种类、掩码像素值和填充算法的规则
  1. 低八位(第0~7位)用于控制算法的连通性,可取4 (4为缺省值) 或者 8。如果设为4,表示填充算法只考虑当前像素水平方向和垂直方向的相邻点;如果设为 8,除上述相邻点外,还会包含对角线方向的相邻点。
  2. 高八位部分(16~23位)可以为0 或者如下两种选项标识符的组合:<1>FLOODFILL_FIXED_RANGE - 如果设置为这个标识符的话,就会考虑当前像素与种子像素之间的差,否则就考虑当前像素与其相邻像素的差。也就是说,这个范围是浮动的。<2>FLOODFILL_MASK_ONLY - 如果设置为这个标识符的话,函数不会去填充改变原始图像 (也就是忽略第三个参数newVal), 而是去填充掩模图像(mask)。这个标识符只对第二个版本的floodFill有用,因第一个版本里面压根就没有mask参数。
  3. 中间八位部分,上面关于高八位FLOODFILL_MASK_ONLY标识符中已经说的很明显,需要输入符合要求的掩码。Floodfill的flags参数的中间八位的值就是用于指定填充掩码图像的值的。但如果flags中间八位的值为0,则掩码会用1来填充。
flags=8 | FLOODFILL_MASK_ONLY | FLOODFILL_FIXED_RANGE | (38<<8)

函数原型2:

int cv::floodFill(InputOutputArray  image,Point  seedPoint,Scalar  newVal,Rect *  rect = 0,Scalar  loDiff = Scalar(),Scalar  upDiff = Scalar(),int  flags                        )

函数所有参数的含义与上文中的相同,不过需要注意的是函数最后一个参数在可选值的范围上有些变换,由于函数不输出掩码矩阵,因此FLOODFILL_MASK_ONLY标志不起任何作用,因此该种函数原型中没有任何意义,甚至可以缺省表示掩码矩阵中被填充像素点的新像素值的第二部分。

#include <opencv2\opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{system("color F0");  //将DOS界面调成白底黑字Mat img = imread("5.jpg");if (!(img.data)){cout << "读取图像错误,请确认图像文件是否正确" << endl;return -1;}imshow("原图", img);RNG rng(10086);//随机数,用于随机生成像素//设置操作标志flagsint connectivity = 4;  //连通邻域方式int maskVal = 255;  //掩码图像的数值int flags = connectivity | (maskVal << 8) | FLOODFILL_FIXED_RANGE;  //漫水填充操作方式标志 //设置与选中像素点的差值Scalar loDiff = Scalar(20, 20, 20);Scalar upDiff = Scalar(20, 20, 20);//声明掩模矩阵变量Mat mask = Mat::zeros(img.rows + 2, img.cols + 2, CV_8UC1);while (true){//随机产生图像中某一像素点int py = rng.uniform(0, img.rows - 1);int px = rng.uniform(0, img.cols - 1);Point point = Point(px, py);//彩色图像中填充的像素值,uniform 函数可以返回指定范围的随机数,也就是说newVal是一个随机像素值Scalar newVal = Scalar(rng.uniform(0, 255), rng.uniform(0, 255),rng.uniform(0, 255));//漫水填充函数int area = floodFill(img, mask, point, newVal, &Rect(), loDiff, upDiff, flags);//输出像素点和填充的像素数目cout << "像素点x:" << point.x << "  y:" << point.y<< "     填充像数数目:" << area << endl;//输出填充的图像结果imshow("填充的彩色图像", img);imshow("掩模图像", mask);//判断是否结束程序int c = waitKey(0);if ((c & 255) == 27){break;}}return 0;
}

opencv漫水填充算法floodfill相关推荐

  1. 水漫金山:OpenCV漫水填充算法(Floodfill)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/28261997 作者:毛星云(浅墨) ...

  2. 【OpenCV入门教程之十五】水漫金山:OpenCV漫水填充算法(Floodfill)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/28261997 作者:毛星云(浅墨) ...

  3. 【OpenCV新手教程之十五】水漫金山:OpenCV漫水填充算法(Floodfill)

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/28261997 作者:毛星云(浅墨) ...

  4. opencv漫水填充算法

    1.定义 使用特定的颜色填充连通区域,通过设置可连通像素的上下限以及连通方式达到不同的填充效果. 2.opencv漫水填充函数 int floodFill(InputOutputArray image ...

  5. opencv漫水填充法。

    向浅墨学习. 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/28261997 作者: ...

  6. OpenCV学习笔记(九): 漫水填充:floodFill()

    OpenCV学习笔记(九): 漫水填充:floodFill() 定义: 漫水填充法是一种用特定的颜色填充联通区域(自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色)通过设置可连通像素的上下限 ...

  7. 【学习OpenCV4】漫水填充算法使用总结

    本文分享内容来自图书<学习OpenCV 4:基于Python的算法实战>,该书内容如下: 第1章 OpenCV快速入门: 第2章 图像读写模块imgcodecs: 第3章 核心库模块cor ...

  8. OpenCV漫水填充

    引言 漫水填充是用一定颜色填充联通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效果;漫水填充经常被用来标记或分离图像的一部分以便对其进行进一步处理或分析,也可以用来从输入图像获取掩码区 ...

  9. OpenCV3之——漫水填充:floodFill函数

    定义 : 漫水填充算法是一种用特定颜色填充连通区域,通过设置像素上下限及连通方式来达到不同的连通效果.漫水填充经常用来标记或分离图像的一部分,以便于对其进行进一步的处理和分析.也可以从输入图像获取掩码 ...

最新文章

  1. linux php 指令,在 Linux 命令行中使用和执行 PHP 代码(一)
  2. Tornado入门三
  3. 1976年,提出公钥密码体制概念的学者
  4. PowerShell尝试登录SQL Server
  5. Velocity浅析及与Jsp、Freemarker对比
  6. azure夜校培训第6场 3月22日 18:00---MYSQL
  7. 【500-Lines-or-Less】-【翻译练习】-【chapter-14】-【简单对象模型】-【第三部分】...
  8. 初学 Delphi 嵌入汇编[13] - 地址参数用 [] 取值
  9. linux卸载jdk权限不够,linux中卸载jdk,一个简单有关问题整了一上午
  10. 基于JAVA后勤管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  11. 微分方程传染病模型之指数模型-SI模型-SIS模型-SIR模型
  12. 天大18春在线考试计算机答案,天津大学期末考核18春学期《画法几何及工程制图》在线作业一全套习题答案...
  13. PHP 下载保存文件到本地
  14. 计算机视觉 | 1. 一切的基础: 灰度图像 (读取,转换,像素定位)
  15. android 修改系统默认时间24小时制
  16. css3 3d旋转图片立方体特效代码
  17. 在Linux上使用迅雷解决方案xware
  18. 上周工作总结及本周工作安排
  19. 如何使用 WEB 技术编写前端代码,实现大屏展示和地图显示功能
  20. Bootstrap5不再支持IE浏览器,在网站顶部给IE浏览器访客给予提示

热门文章

  1. 自研数据分析工具——yandas系列二:分析泰坦尼克号沉船事件中的乘客信息表
  2. 十二月十三号作业驱动作业
  3. 并发编程入门(五):Java并发包和Java8并发
  4. 信阳毛尖大山茶、高山茶、小山茶的辨别
  5. 【Python鸡兔同笼】
  6. 昨天申请了三丰云免费云服务器,体验不错
  7. 【web前端特效源码】使用HTML5+CSS3+JavaScript制作一个扁平化风格css螃蟹图形~~适合初学者~超简单~ |前端开发|IT软件
  8. 十沣科技TF-Dyna不亚于国际主流商业软件 应用领域广泛
  9. kettle carte repository 资源库 useSSL=false warning 警告
  10. 蔡颖-《APS走向实践》书解读之三:供应、计划排程、供应链优化