图像内轮廓填充通常称为孔洞填充,主要用于目标提取。不带任何条件的内轮廓填充,在目标密度很大时,可能导致错误填充。一种典型情况,当多个目标粘连,并 且形成环状时,简单的内轮廓填充会将环状内部背景部分误认为目标空洞进行错误填充。这种错误对于目标分割和提取是非常致命的。

  如果将内轮廓面积作为限制条件进行填充,就可以很好解决上述问题。通常内轮廓面积应该不大于目标的最大面积。

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cxcore.lib")
#pragma comment(lib, "highgui.lib")
// 内轮廓填充
// 参数:
// 1. pBinary: 输入二值图像,单通道,位深IPL_DEPTH_8U。
// 2. dAreaThre: 面积阈值,当内轮廓面积小于等于dAreaThre时,进行填充。
void FillInternalContours(IplImage *pBinary, double dAreaThre)
{
double dConArea;
CvSeq *pContour = NULL;
CvSeq *pConInner = NULL;
CvMemStorage *pStorage = NULL;
// 执行条件
if (pBinary)
{
// 查找所有轮廓
pStorage = cvCreateMemStorage(0);
cvFindContours(pBinary, pStorage, &pContour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
// 填充所有轮廓
cvDrawContours(pBinary, pContour, CV_RGB(255, 255, 255), CV_RGB(255, 255, 255), 2, CV_FILLED, 8, cvPoint(0, 0));
// 外轮廓循环
for (; pContour != NULL; pContour = pContour->h_next)
{
// 内轮廓循环
for (pConInner = pContour->v_next; pConInner != NULL; pConInner = pConInner->h_next)
{
// 内轮廓面积
dConArea = fabs(cvContourArea(pConInner, CV_WHOLE_SEQ));
if (dConArea <= dAreaThre)
{
cvDrawContours(pBinary, pConInner, CV_RGB(255, 255, 255), CV_RGB(255, 255, 255), 0, CV_FILLED, 8, cvPoint(0, 0));
}
}
}
cvReleaseMemStorage(&pStorage);
pStorage = NULL;
}
}
int main()
{
IplImage *img = cvLoadImage(".//test.png", 0);
IplImage *bin = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
cvCopy(img, bin);
FillInternalContours(bin, 200);
cvNamedWindow("img");
cvShowImage("img", img);
cvNamedWindow("result");
cvShowImage("result", bin);
cvWaitKey(-1);
cvReleaseImage(&img);
cvReleaseImage(&bin);
return 0;
} 

OpenCV图象孔洞内轮廓填充相关推荐

  1. matlab灰度图孔洞填充,OpenCV图像内轮廓填-孔洞填充

    //test #include "stdafx.h" #include "cxcore.h" #include "cv.h" #includ ...

  2. Python-基于OpenCV的轮廓填充 泛洪算法 孔洞填充

    左为原图 右为填充后 针对轮廓填充,我们先要提取图像中的轮廓,在对里面的进行颜色填充,这个我自己也有点分不清楚,他和阈值分割进行填充有什么区别,要是有大佬知道,分享一下,将感激不尽!轮廓填充的方法常用 ...

  3. 基于OpencV的轮廓填充算法在3D打印机中的应用

    在这之前,我们需要了解一下SLC文件的格式,只有对格式有一点了解,我们才能做接下来的工作,首先SLC文件中是通过描述各层中的多段线来描述整个模型的,多段线之间两两相连.对单个轮廓来说,最后一点必须等于 ...

  4. opencv实现二值图像孔洞填充

    matlab中的imfill函数可以方便得实现二值图像的孔洞填充,而在opencv中并没有相同功能的函数.因此,在opencv的基础上编写实现孔洞填充的函数,并且能够设定阈值,对面积大于阈值的孔洞不进 ...

  5. opencv实现imfill_使用opencv实现matlab中的imfill填充孔洞功能

    使用opencv实现matlab中的imfill填充孔洞功能,整体思路如下: 1.      首先给原始图像四周加一圈全0,并保存为另一幅图像 2.      使用floodFill函数给新图像进行填 ...

  6. opencv函数findcontours_OpenCV 中的轮廓应用

    目录: 轮廓常用函数 第一个应用 第二个应用 轮廓就是连接所有连续点(沿着边界)的曲线,具有相同的颜色或灰度值.轮廓是形状分析.物体检测和识别的有用工具.为了提高提取轮廓的精确度,需要先通过阈值处理或 ...

  7. 基于OpenCV实战:绘制图像轮廓(附代码)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 山区和地形图中海拔高的区域划出的线称为地形轮廓,它们提供了地形的高 ...

  8. OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标

    OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标 1.寻找轮廓 声明:在寻找图像轮廓之前需要对图像进行阈值分割或者Canny.拉普拉斯等边缘检测算子处理. 寻找轮廓的算子: findContours( ...

  9. Opencv 图像处理-Contours函数提取轮廓及感兴趣区域ROI的必用且实用操作技巧-(涵盖Contours的一切使用基础,附代码段)

            需求目的:一般都是做项目时使用opencv的findcontours和drawcontours搭配使用抓取图像内感兴趣区域. 1.Contours函数轮廓点大小排序 当使用findco ...

最新文章

  1. Java-Web HTTP协议
  2. linux安装java_Linux安装JDK完整步骤
  3. SpringMVC中@RequestParam(username)
  4. maven项目 jetty_如何使用Java,Maven,Jetty创建Web应用程序项目
  5. 3W字!带你玩转「消息队列」
  6. Python风格总结: OS 文件/目录方法
  7. 如何在计算机上设置禁止游戏,如何禁止玩电脑游戏 屏蔽网络游戏的方法
  8. 平面几何----笛沙格定理及其应用
  9. 巴斯大学计算机科学研究生,巴斯大学计算机科学.pdf
  10. 不知道这些你就OUT了,2019年最常见又实用的Android开发面试题
  11. 春秋·左丘明-《左传·成公八年》
  12. tradeblazer mysql_交易开拓者(TradeBlazer)上手指南
  13. 什么是 web API? DOM和BOM
  14. 没想到国美竟然用oracle的团队来搭建电商平台
  15. java递归获取所有的子级节点
  16. Linux刻录光盘win10认不到,Win10不能读取DVD光驱和刻录光盘解决方法
  17. 跌倒检测_使用姿势估计的跌倒检测
  18. git与github使用
  19. Electron主进程和渲染进程之间通信
  20. git master 是啥?

热门文章

  1. 切莫让CDN缓存你的动态文件
  2. 加拿大签证办理时解释信Explanation of Letter参考
  3. IT类人人才如何申请加拿大BC省雇主担保移民
  4. proftpd ldap mysql_在debian linux安装proftpd
  5. 计算机组装所需硬件,电脑配件,详细教您电脑组装需要哪些配件
  6. JNDI注入学习(看不懂直接喷,别忍着!)
  7. matlab中仿真中接地,基于Matlab的配电网接地故障仿真
  8. 自定义View将圆角矩形绘制在Canvas上
  9. 使用GDAL工具对OrbView-3数据进行正射校正
  10. html5绘制火柴棒人物