当前位置: 首页 > news >正文

FloodFill(漫水填充)算法

  在OpenCV里有一个函数,为cvFloodFill(IplImage* img, CvPoint seedPoint, CvScalar newVal,

cvScalar loDiff=cvScalarAll(0), cvScalar upDiff=cvScalarAll(0), CvConnectedComp* com=NULL,

int flags=4, CvArr* mask = NULL)

其中各参数的意义为:img指输入图像, seedPoint指种子像素坐标,newVal指用来填充区域的新颜色,loDiff和upDiff分别指与种子像素的值的上下差值。而com指填充的联通域信息指针,其成员变量包括面积大小和平均颜色等信息。flags是关键参数,它包含了填充的几种方式选择,如邻哉是4联通还是8联通,是否只填充掩码矩阵,以及掩码矩阵的掩码值(默认为1)

mask为掩码矩阵,它是即是一个输入参数也是一个输出参数。mask作为输入时只有掩码值为0的像素点有效,而输出时有填充的像素的坐标点上也相应的被掩码(掩码值由flags决定,默认为1)

  对于此函数所用的算法,并没有仔细去分析它的代码。而是认识了两种比较简单的算法。分别如下:
算法一:递归算法

void floodFill(int x, int y, int fill, int old)
{
  if ((x < 0) || (x >= width)) return;
  if ((y < 0) || (y >= height)) return;
  if (getPixel(x, y) == old)

  {
    setPixel(fill, x, y);
    floodFill(x+1, y, fill, old);
    floodFill(x, y+1, fill, old);
    floodFill(x-1, y, fill, old);
    floodFill(x, y-1, fill, old);
  }
}

8邻域的填充过种也是一样,此算法的过程简单易懂,效率也较高,但由于函数的反复调用会使操作系统的栈溢出。

算法二:基于行一致性的算法

(1)将种子点入栈;

while(栈非空)

{

(2)将种子点出栈;

(3)填充联通的此行;

(4)并将邻域内联通的上下行中的一行最右边的点作为种子点入栈;

}

此算法的缺点是会造成很多点的重复访问。

 

 

 

转载于:https://www.cnblogs.com/seacode/archive/2010/09/08/1821574.html

相关文章:

  • 升级BIOS解决DELL R730XD虚拟机死机问题
  • C# 委托,事件和Lambda表达式
  • ES6学习笔记四 default、rest、Multi-line Strings
  • SharePoint 2010 Excel Service 入门——在网页上显示Excel内容
  • New Concept English Two 33 94
  • 100%高度全屏自适应
  • Django REST框架--关系和超链接api
  • sql语句的字段转成Date
  • [转]java按指定编码写入和读取文件内容的类
  • Android开发者应该深入学习的10个开源应用项目
  • centos7.3 docker升级
  • volatile和synchronized的区别
  • 全国省市数据库 access 版
  • CodeSmith模板引擎系列-目录
  • 分布式术语
  • Date型的使用
  • If…else
  • JavaScript设计模式系列一:工厂模式
  • Javascript设计模式学习之Observer(观察者)模式
  • mac修复ab及siege安装
  • nodejs调试方法
  • opencv python Meanshift 和 Camshift
  • Vue.js-Day01
  • Vue2.0 实现互斥
  • 不上全站https的网站你们就等着被恶心死吧
  • 蓝海存储开关机注意事项总结
  • 思考 CSS 架构
  • 走向全栈之MongoDB的使用
  • 函数计算新功能-----支持C#函数
  • 说说我为什么看好Spring Cloud Alibaba
  • 正则表达式-基础知识Review
  • #QT(一种朴素的计算器实现方法)
  • (1) caustics\
  • (pojstep1.1.2)2654(直叙式模拟)
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (多级缓存)缓存同步
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)memcache、redis缓存
  • *p++,*(p++),*++p,(*p)++区别?
  • .gitattributes 文件
  • .NET和.COM和.CN域名区别
  • .NET中统一的存储过程调用方法(收藏)
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [2010-8-30]
  • [Bada开发]初步入口函数介绍
  • [BUUCTF]-Reverse:reverse3解析
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [C\C++]读入优化【技巧】
  • [gdc19]《战神4》中的全局光照技术
  • [hdu 3652] B-number
  • [Hive] CTE 通用表达式 WITH关键字