C++ Opencv imfill 孔洞填充函数的实现(学习笔记)
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 孔洞填充函数的实现(学习笔记)相关推荐
- C++ Opencv imfill 孔洞填充函数的实现(更新后)
目录 一.须知 二.演示过程 代码展示 主函数展示 原图 运行结果 三.总结 一.须知 本文章所提供代码不是自创,由于时间太久实在找不到来源,发布出来只为给大家提供便利,完全免费. 话不多说,不想看文 ...
- opencv 实现孔洞填充的两个解决方案 MATLAB--imfill功能(收集)
opencv 孔洞填充,方案1: http://bbs.csdn.net/topics/391542633?page=1 opencv 孔洞填充,方案1: 其实主要是imfill(matrix, 'h ...
- OpenCV中文文档4.0.0学习笔记(更新中……)
系列文章目录 文章目录 系列文章目录 前言 一.简介 1.OpenCV-Python教程简介 2.OpenCV-Python 3.OpenCV-Python教程 4.OpenCV 需要你!!! 二.G ...
- linux xlib函数手册,Xlib 学习笔记
Xlib学习笔记第一章1.2 X Window System概念display:由键盘,鼠标和一个或多个屏幕组成的一个工作站screen:一个display可以有多个screen server-cli ...
- python 内置函数转list_python学习笔记11-python内置函数
python学习笔记11-python内置函数 一.查看python的函数介绍: 二.python内置函数 1.abs获取绝对值: 通过python官网查看absabs(x) Return the a ...
- matlab 实现二值图像孔洞填充函数imfill()
代码如下: function [I2,locations] = imfill(varargin)[I,locations,conn,do_fillholes] = parse_inputs(varar ...
- matlab imfill孔洞填充
BW2 = imfill(BW) 作用填充二值图像BW中的空洞 clear all; clc; close all; img = imread('test1.png'); if ndims(img)= ...
- Java中执行存储过程和函数(web基础学习笔记十四)
一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. CallableStatement 接口继承自PreparedStatement 接口.所以CallableS ...
- r语言regexpr函数_R语言学习笔记-文本挖掘之字符处理(1)
在挖掘分析的过程当中对字符串的处理是极为重要的,且出现也较为频繁,R语言作为当前最为流行的开源数据分析和可视化平台,虽然文本的处理并不是它的强项, 但是R语言还是包含大量的字符串操作工具,本章着重整理 ...
最新文章
- 九零后的五年七次工作经历
- cv2.dnn读取模型报错
- 在不同制作基础上该如何选择网页制作软件?
- 30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
- 优化传输文件的性能- -零拷贝
- 说说windows10自带浏览器Edge的好与不好
- oracle将字符串转成数组_【算法打卡】上升下降字符串
- DataGridView 动态绑定列
- Matlab 移动通信原理-扩频通信系统仿真实验(扩频通信系统的多用户数据传输、利用蒙特卡罗仿真方法对扩频增益进行性能仿真)
- sprintf()函数的用法
- ps4html5播放器,PS4迎来全新媒体播放器 支持多种视频音频格式
- 自律不熬夜真的那么难吗?
- 如何在html中引入代码,如何在HTML页面引入javaScript代码
- ubuntu14.04 下基于Nginx搭建mp4/flv流媒体服务器
- 海康IPC+ffmpeg+nginx+ckplayer实现网页实时预览监控视频
- 天猫618,吃货们最爱哪些生鲜品牌?
- Python实例---爬取下载喜马拉雅音频文件
- 百度用AI“唤醒”历史,中国文化名片与科技名片相互成就
- canvas画任意角度的扇形,弧形,及扇形弧形填纯色渐变色
- 【网络】网络基础概念