C++ Opencv imfill 孔洞填充函数的实现

  • 敬告
  • 函数实现的中心思想
    • 二值图
    • 寻找连通域的关键
    • 种子点的确定
    • 连通域的寻找过程
    • 条件设定
    • 最后赋值
    • 话不多说 直接上函数代码
    • 主函数代码
    • 代码框截图
    • 实例图片
    • 运行结果

敬告

本文所述内容已经更新,大可不必继续阅读,更新后内容请点击以下链接
点我

函数实现的中心思想

二值图

此程序针对于二值图,寻找二值图中 像素值为0的连通域,将所有连通域的像素点分别保存下来,将符合条件的连通域的像素值 置为255;

寻找连通域的关键

针对填洞功能的实现,也就是0置为255过程,我们需要以四连通为基本点进行寻找。

种子点的确定

寻找种子点,其实就是寻找二值图中像素值为0的点,我们可以直接采取 遍历 二值图 中的像素,将第一个遇见的像素值为0的点确定为 第一个连通域的种子点。这时候,有一些朋友可能会疑惑,因为按照我的说法,在遍历 的过程中,遇见的第n个像素值为0的点 就是第n个连通域的种子点,进一步说,在整个遍历过程中,遇见像素值为0的像素点的个数,就是连通域的个数。
是的!
当然,如果要实现这一点,那我们就需要在各个连通域的寻找的过程中,将找到的点全部立即置为255,(此处不一定非得是255,只要不是0即可)这样在寻找结束后,我们再遍历二值图时,已经找到的连通域中的所有像素点的值均为255,当再次找到像素值为0 的像素点时,此像素点必是下一个待寻找的连通域的种子点

连通域的寻找过程

首先创建四连通的向量,vector<Point> upp;用来存储上下前后四个点,
创建vector<vector<vector<Point>>> lenm;用来存储所有的连通域,至于为什么要创建三维Point数组,大家可以先看看关于这个三维数组的注释,(下面的公式就是,程序中也有相应的注释),了解清楚每一维代表的意义,再结合一下程序,我感觉大家应该可以明白,再简要赘述一下,lenm.size()为连通域的个数。
如图所示;函数为第i个连通域像素点个数的求和。

条件设定

在经过以上的寻找过程后,得到的结果必然是全白的图像,而我们只想要填充孔洞,所以我们需要去除不符合的连通域。所谓孔洞,其实就是周围被像素值为255的点包围起来的连通域,但是,有一些连通域,直接和图像的边界相连,而这并不是我们想要的, 至少不是我想要的,(如果大家有不同的需求,程序也是很容易改过去的)。所以,我需要一个标志位,当这个连通域中的像素点接触到边界后,给这个连通域一个标记。在下面的程序中,我用vector<vector<int>> Flag;来存储标记点,其中Flag[i]表示第i个连通域的标记点。在程序中,找到种子点后,首先将第i个连通域的Flag[i][0] = 1;,如果在此连通域中出现边界点,再Flag[i][0] = 0;(在程序中,此处貌似有一个小BUG,我就先不改了[

C++ Opencv imfill 孔洞填充函数的实现(学习笔记)相关推荐

  1. C++ Opencv imfill 孔洞填充函数的实现(更新后)

    目录 一.须知 二.演示过程 代码展示 主函数展示 原图 运行结果 三.总结 一.须知 本文章所提供代码不是自创,由于时间太久实在找不到来源,发布出来只为给大家提供便利,完全免费. 话不多说,不想看文 ...

  2. opencv 实现孔洞填充的两个解决方案 MATLAB--imfill功能(收集)

    opencv 孔洞填充,方案1: http://bbs.csdn.net/topics/391542633?page=1 opencv 孔洞填充,方案1: 其实主要是imfill(matrix, 'h ...

  3. OpenCV中文文档4.0.0学习笔记(更新中……)

    系列文章目录 文章目录 系列文章目录 前言 一.简介 1.OpenCV-Python教程简介 2.OpenCV-Python 3.OpenCV-Python教程 4.OpenCV 需要你!!! 二.G ...

  4. linux xlib函数手册,Xlib 学习笔记

    Xlib学习笔记第一章1.2 X Window System概念display:由键盘,鼠标和一个或多个屏幕组成的一个工作站screen:一个display可以有多个screen server-cli ...

  5. python 内置函数转list_python学习笔记11-python内置函数

    python学习笔记11-python内置函数 一.查看python的函数介绍: 二.python内置函数 1.abs获取绝对值: 通过python官网查看absabs(x) Return the a ...

  6. matlab 实现二值图像孔洞填充函数imfill()

    代码如下: function [I2,locations] = imfill(varargin)[I,locations,conn,do_fillholes] = parse_inputs(varar ...

  7. matlab imfill孔洞填充

    BW2 = imfill(BW) 作用填充二值图像BW中的空洞 clear all; clc; close all; img = imread('test1.png'); if ndims(img)= ...

  8. Java中执行存储过程和函数(web基础学习笔记十四)

    一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. CallableStatement 接口继承自PreparedStatement 接口.所以CallableS ...

  9. r语言regexpr函数_R语言学习笔记-文本挖掘之字符处理(1)

    在挖掘分析的过程当中对字符串的处理是极为重要的,且出现也较为频繁,R语言作为当前最为流行的开源数据分析和可视化平台,虽然文本的处理并不是它的强项, 但是R语言还是包含大量的字符串操作工具,本章着重整理 ...

最新文章

  1. 九零后的五年七次工作经历
  2. cv2.dnn读取模型报错
  3. 在不同制作基础上该如何选择网页制作软件?
  4. 30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
  5. 优化传输文件的性能- -零拷贝
  6. 说说windows10自带浏览器Edge的好与不好
  7. oracle将字符串转成数组_【算法打卡】上升下降字符串
  8. DataGridView 动态绑定列
  9. Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)
  10. sprintf()函数的用法
  11. ps4html5播放器,PS4迎来全新媒体播放器 支持多种视频音频格式
  12. 自律不熬夜真的那么难吗?
  13. 如何在html中引入代码,如何在HTML页面引入javaScript代码
  14. ubuntu14.04 下基于Nginx搭建mp4/flv流媒体服务器
  15. 海康IPC+ffmpeg+nginx+ckplayer实现网页实时预览监控视频
  16. 天猫618,吃货们最爱哪些生鲜品牌?
  17. Python实例---爬取下载喜马拉雅音频文件
  18. 百度用AI“唤醒”历史,中国文化名片与科技名片相互成就
  19. canvas画任意角度的扇形,弧形,及扇形弧形填纯色渐变色
  20. 【网络】网络基础概念

热门文章

  1. 100个python算法超详细讲解:双色球
  2. 安卓手机的内置传感器
  3. 钢铁是怎样炼成的 第四章
  4. react-native-web 阿里字体图标ttf文件不加载、乱码问题
  5. 新手必备,教你如何快速绘制出采购流程图?
  6. android 绘制心率曲线图,Android 特效View第四弹之折线图 心率图
  7. TI处理器EDMA的三种触发方式与通道
  8. 基于PEview分析PE文件(4-3)
  9. 计算机桌面上的声音图标没了怎么办,电脑桌面的声音图标不见了怎么办
  10. android音量图标不见了,系统音量图标不见了