OpenCV图像细化的一个例子
2015-07-25 11:12
495 查看
转自:http://blog.csdn.net/zfdxx369/article/details/9091953?utm_source=tuicool
本文是zhang的一篇经典图像细化论文,效果很好,采用并行计算,速度非常快;
下文是 "智慧视觉"在CSDN上对这篇论文程序的一个改造,亲测可用!
由于OpenCV没有自带的图像细化函数,网上提供的基本是基于1.0接口的,于是乎动手搞成2.0 Mat类型接口的,方便好用。细化方法当中,当属经典的Zhang并行快速细化算法,细化之后的轮廓走势与原图保持得相对较好.
本文是zhang的一篇经典图像细化论文,效果很好,采用并行计算,速度非常快;
下文是 "智慧视觉"在CSDN上对这篇论文程序的一个改造,亲测可用!
由于OpenCV没有自带的图像细化函数,网上提供的基本是基于1.0接口的,于是乎动手搞成2.0 Mat类型接口的,方便好用。细化方法当中,当属经典的Zhang并行快速细化算法,细化之后的轮廓走势与原图保持得相对较好.
//将 DEPTH_8U型二值图像进行细化 经典的Zhang并行快速细化算法 void thin(const Mat &src, Mat &dst, const int iterations) { const int height =src.rows -1; const int width =src.cols -1; //拷贝一个数组给另一个数组 if(src.data != dst.data) { src.copyTo(dst); } int n = 0,i = 0,j = 0; Mat tmpImg; uchar *pU, *pC, *pD; BOOL isFinished =FALSE; for(n=0; n<iterations; n++) { dst.copyTo(tmpImg); isFinished =FALSE; //一次 先行后列扫描 开始 //扫描过程一 开始 for(i=1; i<height; i++) { pU = tmpImg.ptr<uchar>(i-1); pC = tmpImg.ptr<uchar>(i); pD = tmpImg.ptr<uchar>(i+1); for(int j=1; j<width; j++) { if(pC[j] > 0) { int ap=0; int p2 = (pU[j] >0); int p3 = (pU[j+1] >0); if (p2==0 && p3==1) { ap++; } int p4 = (pC[j+1] >0); if(p3==0 && p4==1) { ap++; } int p5 = (pD[j+1] >0); if(p4==0 && p5==1) { ap++; } int p6 = (pD[j] >0); if(p5==0 && p6==1) { ap++; } int p7 = (pD[j-1] >0); if(p6==0 && p7==1) { ap++; } int p8 = (pC[j-1] >0); if(p7==0 && p8==1) { ap++; } int p9 = (pU[j-1] >0); if(p8==0 && p9==1) { ap++; } if(p9==0 && p2==1) { ap++; } if((p2+p3+p4+p5+p6+p7+p8+p9)>1 && (p2+p3+p4+p5+p6+p7+p8+p9)<7) { if(ap==1) { if((p2*p4*p6==0)&&(p4*p6*p8==0)) { dst.ptr<uchar>(i)[j]=0; isFinished =TRUE; } // if((p2*p4*p8==0)&&(p2*p6*p8==0)) // { // dst.ptr<uchar>(i)[j]=0; // isFinished =TRUE; // } } } } } //扫描过程一 结束 dst.copyTo(tmpImg); //扫描过程二 开始 for(i=1; i<height; i++) //一次 先行后列扫描 开始 { pU = tmpImg.ptr<uchar>(i-1); pC = tmpImg.ptr<uchar>(i); pD = tmpImg.ptr<uchar>(i+1); for(int j=1; j<width; j++) { if(pC[j] > 0) { int ap=0; int p2 = (pU[j] >0); int p3 = (pU[j+1] >0); if (p2==0 && p3==1) { ap++; } int p4 = (pC[j+1] >0); if(p3==0 && p4==1) { ap++; } int p5 = (pD[j+1] >0); if(p4==0 && p5==1) { ap++; } int p6 = (pD[j] >0); if(p5==0 && p6==1) { ap++; } int p7 = (pD[j-1] >0); if(p6==0 && p7==1) { ap++; } int p8 = (pC[j-1] >0); if(p7==0 && p8==1) { ap++; } int p9 = (pU[j-1] >0); if(p8==0 && p9==1) { ap++; } if(p9==0 && p2==1) { ap++; } if((p2+p3+p4+p5+p6+p7+p8+p9)>1 && (p2+p3+p4+p5+p6+p7+p8+p9)<7) { if(ap==1) { // if((p2*p4*p6==0)&&(p4*p6*p8==0)) // { // dst.ptr<uchar>(i)[j]=0; // isFinished =TRUE; // } if((p2*p4*p8==0)&&(p2*p6*p8==0)) { dst.ptr<uchar>(i)[j]=0; isFinished =TRUE; } } } } } } //一次 先行后列扫描完成 //如果在扫描过程中没有删除点,则提前退出 if(isFinished ==FALSE) { break; } } } }
相关文章推荐
- AOP学习并实践
- 企业级应用架构模型-并发,事务,锁
- 二分匹配Hopcroft-Karp算法
- 专业网站和数据下载主页收藏
- shell语法简介
- 项目加载不进去tomcat
- hadoop2.4.1伪分布式搭建
- TOMCAT多站点配置
- CentOS 6.x搭建Open***实现双IDC互联
- Hadoop hdfs增删该查 简单写法
- hadoop Hdfs文件上传下载
- UVa 11078 - Open Credit System(维护最大值)
- centos7 安装R和Rstudio客户端
- Linux之GTK系列教程
- 新浪微博架构
- Openssl rand命令
- OPENCV 学习例程(1)图片读写 色彩空间转换
- JAVA & PHP 结合 开发系统网站
- Openssl oscp命令
- 介紹好用工具:RichCopy (檔案複製與備份的絕佳工具)