在Matlab下,使用imfill可以很容易的完成孔洞填充操作,感觉这是一个极为常用的方法,然而不知道为什么OpenCV里面却没有集成这个函数。在网上查了好多关于Opencv下的孔洞填充方法,大部分使用轮廓查找方法去做的,但对于这种方法,总感觉不是特别好。

    最近重新使用这个方法,正好之前了解过冈萨雷斯那本书上的孔洞填充算法,所以想着手重新写一个。这里借鉴了冈萨雷斯书上的集合运算方法(并不完全一样)

 空洞图像的定义:由前景像素相连接的边界所包围的一个背景区域。对于二值图像,可以理解为被白色区域所包围的黑色区域就是空洞区域。

    大致思路如下:

    0, 设原图像为 A。

    1, 首先A向外延展一到两个像素,并将值填充为背景色(0),标记为B。

    2, 使用floodFill函数将B的大背景填充,填充值为前景色(255),种子点为(0,0)即可(步骤一可以确保(0,0)点位于大背景),标记为C。

    3, 将填充好的图像裁剪为原图像大小(去掉延展区域),标记为D。

    4, 将D取反与A相加即得填充的图像,E=A|(~D)。

下面使用OpenCV对算法进行函数封装:

void fillHole(const Mat srcBw, Mat &dstBw)
{
Size m_Size = srcBw.size();
Mat Temp=Mat::zeros(m_Size.height+,m_Size.width+,srcBw.type());//延展图像
srcBw.copyTo(Temp(Range(, m_Size.height + ), Range(, m_Size.width + ))); cv::floodFill(Temp, Point(, ), Scalar()); Mat cutImg;//裁剪延展的图像
Temp(Range(, m_Size.height + ), Range(, m_Size.width + )).copyTo(cutImg); dstBw = srcBw | (~cutImg);
}

填充结果如图所示:

::Longvipp

OpenCV二值图像孔洞填充的一个简单方法的更多相关文章

  1. Python-OpenCV实现二值图像孔洞填充

    代码如下: import cv2 import numpy as np def FillHole(mask): contours, hierarchy = cv2.findContours(mask, ...

  2. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

  3. 判定你的java应用是否正常(是否内存、线程泄漏)的一个简单方法

    给大家推荐一个最简单的判定你的java应用是否正常的方法: step1:部署你的应用,让它跑起来: step2:打开jdk下bin目录下的jconsole.exe工具,连接到你的应用——以监测线程和内 ...

  4. Linux 清楚历史history命令的一个简单方法

    有时候做了一些历史记录 不想让别人知道, 发现最简单的办法是 set HISTSIZE=0 然后 history 就没有历史记录命令了 然后为了能用上下键进行历史命令使用 再 set HISTSIZE ...

  5. golang 记录函数执行耗时的一个简单方法。

    先写一个公共函数, 比如在 common 包下有这么一个方法: // 写超时警告日志 通用方法 func TimeoutWarning(tag, detailed string, start time ...

  6. OpenCV 入门示例之四:一个简单的变换

    前言 图像的平滑处理,是计算机视觉中非常重要的操作,本文将展示一个可以对图像进行平滑处理的简单程序.而关于平滑处理深层次的知识,会在以后的文章中重点探讨. 代码示例 // 此头文件包含图像IO函数的声 ...

  7. 关于如何读取XML文件的一个简单方法

    在平时开发系统功能的时候,我们经常会碰到一些需求需要经常性的发生变化,比如 系统版本.更新日志 等等.这个时候用一个XML文件来替代数据库,就会变的简便很多. 前段时候我也正好需要改个需求,是关于客户 ...

  8. php统计网站访问次数的一个简单方法

    这里主要用到了session保存当前访问者,并将访问次数写入本地文件. <? @session_start(); $counter = intval(file_get_contents(&quo ...

  9. 一个简单方法:构造xml的document,并将其转换为string

    首先,构造一个document对象: Document doc = null; try { doc = DocumentBuilderFactory.newInstance() .newDocumen ...

随机推荐

  1. 工作中常用的js、jquery自定义扩展函数代码片段

    仅记录一些我工作中常用的自定义js函数. 1.获取URL请求参数 //根据URL获取Id function GetQueryString(name) { var reg = new RegExp(&q ...

  2. CentOS6.7搭建LNMP环境

    1:查看环境: [root@localhost ~]# cat /etc/redhat-release 2:关掉防火墙 #重启后生效开启 [root@localhost ~]# chkconfig i ...

  3. 【问题】关于Mapper not initialized的问题

    ERROR -- ::, [ ] nHandling.AbpApiExceptionFilterAttribute - Mapper not initialized. Call Initialize ...

  4. 如何用Web技术开发Windows Form应用

    现在H5很热,很多互联网公司的产品都采用混合编程,其中各个平台客户端的“壳”为原生控件,但是内容很多都是Web网页,因此可以做出很多炫酷的效果.随着Node.js和Ionic等框架的出现,现在感觉Ja ...

  5. 用canvas绘制折线图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. JQuery效果-淡入淡出、滑动、动画

    一.JQuery Fading方法 JQuery 有四种fade方法 1.fadeIn() 淡入                       对应也有$(selector).fadeIn(speed, ...

  7. SecutrCRTt 连接VirtualBox 中的Ubuntu -端口转发

    端口转发: 设置>网络>端口转发   端口转发: 子系统地址通过在Linux系统总使用ifconfig查看:   还需要在linux主机上安装sshd sudo apt-get insta ...

  8. AndroidProjects个人项目归纳

    AndroidProjects 个人总结归纳-目录大纲 Data Binding框架MVVM BaseView CollapseView 更新中... 项目地址:https://github.com/ ...

  9. 一个URL的物理文件的体现

    场景 许多同学在开发过程中经常会遇到一个问题,怎么去定义一个url?以及定义一个url之后怎么根据一个url定义文件. 公司组织一次内部培训,为了把这次培训的内容以博客的形式共享出来. URL与文件的 ...

  10. jquery 元素控制(追加元素/追加内容)

    参考网址:http://www.jquerycn.cn/a_5521 一.在元素内部/外部追加元素 append,prepend:添加到子元素 before,after:作为兄弟元素添加 html: ...