opencv删除小连通区域(轮廓)---iplImage版本
对于上图的二值化图像,要去除左下角和右上角的噪点,方法:使用opencv去掉黑色面积较小的连通域。
代码
- CvSeq* contour = NULL;
- double minarea = 100.0;
- double tmparea = 0.0;
- CFileDialog dlg(true);
- if (dlg.DoModal()==IDOK)
- {
- CvMemStorage* storage = cvCreateMemStorage(0);
- IplImage* img_src= cvLoadImage(dlg.GetPathName(),CV_LOAD_IMAGE_ANYCOLOR);
- IplImage* img_Clone=cvCloneImage(img_src);
- //访问二值图像每个点的值
- uchar *pp;
- //显示原始图像
- cvNamedWindow("img_src",CV_WINDOW_AUTOSIZE);
- cvShowImage("img_src", img_src);
- IplImage* img_dst = cvCreateImage(cvGetSize(img_src),IPL_DEPTH_8U,1);
- //------------搜索二值图中的轮廓,并从轮廓树中删除面积小于某个阈值minarea的轮廓-------------//
- CvScalar color = cvScalar(255,0,0);//CV_RGB(128,0,0);
- CvContourScanner scanner = NULL;
- scanner = cvStartFindContours(img_src,storage,sizeof(CvContour),CV_RETR_CCOMP,CV_CHAIN_APPROX_NONE,cvPoint(0,0));
- //开始遍历轮廓树
- CvRect rect;
- while (contour=cvFindNextContour(scanner))
- {
- tmparea = fabs(cvContourArea(contour));
- rect = cvBoundingRect(contour,0);
- if (tmparea < minarea/*||tmparea>4900*/)
- {
- //当连通域的中心点为黑色时,而且面积较小则用白色进行填充
- pp=(uchar*)(img_Clone->imageData + img_Clone->widthStep*(rect.y+rect.height/2)+rect.x+rect.width/2);
- if (pp[0]==0)
- {
- for(int y = rect.y;y<rect.y+rect.height;y++)
- {
- for(int x =rect.x;x<rect.x+rect.width;x++)
- {
- pp=(uchar*)(img_Clone->imageData + img_Clone->widthStep*y+x);
- if (pp[0]==0)
- {
- pp[0]=255;
- }
- }
- }
- }
- }
- }
- cvSaveImage("c://temp//aav.bmp",img_Clone);
分析:对于上图来说连通域共有:
这么七个,我们的目标是去除2号和3号连通域,
程序中语句 tmparea = fabs(cvContourArea(contour));可以得到当前连通域的面积,当此面积小于阈值时对其填充为白色。
rect = cvBoundingRect(contour,0); 得到的是框住连通域的最小矩形,对矩形中的黑色部分将其填充为白色,但是这样的话,连通域6和4两个连通域被填充成了白色的矩形,这显然不符合我们的要求,这样就要判断此连通域是黑色联通域还是白色连通域,采用的方法是测试矩形的中心点,如果其为黑色,则认为此连通域是黑色连通域,否则为白色联通域,对于黑色联通域我们对其进行白色填充处理,对于白色联通域则保持不变。
微信扫码关注我们:跟着数理化走天下
获得更多的信息哦,一起交流,一起成长哦:微信号:跟着数理化走天下,纯属个人的交流,无盈利目的
opencv删除小连通区域(轮廓)---iplImage版本相关推荐
- 【小知识】opencv里去掉小连通区域的函数remove_small_objects()解析
网上搜了好多都没有详细的解释函数里面参数的,参考的python数字图像处理(18):高级形态学处理,码下来省得以后再找了. 有些时候,我们只需要一些大块区域,那些零散的.小块的区域,我们就需要删除掉, ...
- 图片连通区域检测(Label connected regions)与去除小连通区域(remove small regions)
图片连通区域检测(Label connected regions of an integer array) 更多关注: https://github.com/chanhal https://www.z ...
- OpenCV使用小札记-Cvmat与IplImage的相互转换
1.IplImage转Cvmat IplImage* src = cvLoadImage("rice.bmp",0); CvMat* mat=cvCreateMat(src ...
- Java+opencv3.2.0之删除最小连通区域
吐槽一下,在网上查了半天opencv3关于删除最小连通区域的方法,结果还是没找到,就自己写了一个,效果还可以,就发出来和大家分享一下. 思路: 1.遍历所有像素点 2.每遍历到一个黑点就去判断是否为连 ...
- opencv(十三)-快速连通区域分析
索引目录 1.连通区域标记算法 2.剔除小连通区域 参考 1.连通区域标记算法 连接区域标记算法(connected component labeling algorithm)是图像分析中最常用的算法 ...
- ViSP学习笔记(十四):连通区域跟踪
开发环境:Ubuntu 18.04 LTS + ROS Melodic + ViSP 3.3.1 文章内容主要参考ViSP官方教学文档:https://visp-doc.inria.fr/doxyge ...
- 让书和背景分离/去除大区域中小的连通区域(python实现)
删除小块区域 有些时候,我们只需要一些大块区域,那些零散的.小块的区域,我们就需要删除掉, 则可以使用morphology子模块的remove_small_objects函数. 让书和背景分离 对图片 ...
- OpenCV删除面积小的区域 实现图像二值化分割 标记连通区域
OpenCV删除面积小的区域 实现图像二值化分割 标记连通区域 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/781 ...
- OpenCV编程案例:使用轮廓函数检测连通区域
转自:http://www.aiseminar.cn/bbs/thread-617-1-1.html 此案例位于CXCORE中cvDrawContours函数介绍部分给出.此程序首先载入一个二值图像文 ...
最新文章
- C#和Sql Server 2005中时间的最大值和最小值
- 推荐JQuery学习简介
- [转]NUnit详细使用方法
- 介绍一个 Windows 10 资源管理器的替代工具 - Explorer++
- 与台风相伴,他们是前行的逆风者
- Android配置模拟器参数,夜神模拟器支持命令行参数列表
- 采购季:云服务不断进化为企业带来更多选择
- 在线短视频缩略图剪切工具
- windows系统bat批处理 mysql 脚本启动关闭
- 【优化算法】杂草优化算法(IWO)【含Matlab源码 1076期】
- access mysql 操作方法_设置和取消Access数据库密码-图解教程
- 怎么看java源代码
- SecondCopy 2000 简单说明
- 计算机鼠标不灵活怎么办,鼠标左键不灵敏,教您鼠标左键不灵敏怎么办
- 忘记背后 努力面前 向着标杆直跑!(转)
- HTML Responsive Web Page
- 18在protel DXP中PCB图中给电路板绘制边框、安装孔的方法介绍成都电路板设计
- python32位和64位有什么区别_python32位和64位的区别是什么
- 透彻理解位图与矢量图的本质区别(小包子觉得讲的很清晰)
- 20141115 【 Arduino - LM35 - 4位八段数码管 】 数码管显示温度
热门文章
- 仿爱奇艺UI界面(第一天)
- 20道HTML基础面试题(附答案)
- 树莓派体验13 - 树莓派3B板载wifi配置方法
- 真实评测 i7 12700f和i7 12700kf区别 i712700f和i712700kf差多少
- numpy的astype函数
- 跨vlan通信之vlanif配置-华为ensp
- (17)Redis 服务器
- 怎样用matlab实现图像的缩放,matlab实现图像缩放
- JavaScript我的第n+1次学习
- 练习:1的1次幂+2的2次幂+.......n的n次幂的值