转自:http://blog.csdn.net/zfdxx369/article/details/9091953?utm_source=tuicool

本文是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;
}
} }
}

OpenCV图像细化的一个例子的更多相关文章

  1. opencv 图像细化

    图像细化多用于机器人视觉,OCR字符识别等领域,细化后的图像经过去毛刺就成为了我们常说的图像的骨架. 该图像细化代码依据论文: T. Y. ZHANG and C. Y. SUEN  A Fast P ...

  2. 【opencv】图像细化

    [原文:http://blog.csdn.net/qianchenglenger/article/details/19332011] 在我们进行图像处理的时候,有可能需要对图像进行细化,提取出图像的骨 ...

  3. opencv图像的基本操作3

    1.获取像素并修改 读取一副图像,根据像素的行和列的坐标获取它的像素值,对于RGB图像而言,返回RGB的值,对于灰度图则返回灰度值 import cv2 import numpy img = cv2. ...

  4. OpenCV图像处理中“投影技术”的使用

           本文区分"问题引出"."概念抽象"."算法实现"三个部分由表及里具体讲解OpenCV图像处理中"投影技术" ...

  5. opencv——图像直方图与反向投影

    引言 在图像处理中,对于直方图这个概念,肯定不会陌生.但是其原理真的可以信手拈来吗? 本文篇幅有点长,在此列个目录,大家可以跳着看: 分析图像直方图的概念,以及opencv函数calcHist()对于 ...

  6. <学习opencv>图像和大型阵列类型

    OPenCV /*=========================================================================*/ // 图像和大型阵列类型 /* ...

  7. SSE图像算法优化系列三十二:Zhang\Guo图像细化算法的C语言以及SIMD指令优化

    二值图像的细化算法也有很多种,比较有名的比如Hilditch细化.Rosenfeld细化.基于索引表的细化.还有Opencv自带的THINNING_ZHANGSUEN.THINNING_GUOHALL ...

  8. OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...

  9. 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

随机推荐

  1. spring-boot-framework 如何自动将对象返回成json格式

    使用srping-rest-mvc 的时候只要在工程的classpath中包含jackson的2.x版本,就可以不用自己做json格式的转换了. 如在你的pom文件中加入以下的依赖: <depe ...

  2. 【代码笔记】iOS-文字走马灯效果

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  3. 一个3D ar打飞机的游戏iOS源码

    这是国内目前第一款集合了AR实景,3D游戏和人脸识别的射击游戏,通过旋转和改变手机的角度与位置,所有的射击操作都靠手势来完成,目前所有的源码全部都在这里.appStore地址:https://itun ...

  4. YourSQLDba版本升级总结

    在使用YourSQLDba做数据库备份.维护时,像其它软件一样,版本升级是不可避免的.因为YourSQLDba一直在不停更新版本.扩展功能.下面介绍一下升级YourSQLDba时的具体步骤和一些注意事 ...

  5. MySQL性能优化——索引

    原文地址:http://blog.codinglabs.org/articles/theory-of-mysql-index.html InnoDB使用B+Tree作为索引结构 最左前缀原理与相关优化 ...

  6. 用alarmmanager 多次发送PendingIntent

    遇到如下问题 service中得一随机数 用alarmmanager 发送PendingIntent的时候,receiver收到的随机数不变. pendingintent传值经常获取到的值是第一次的值 ...

  7. cefsharp设置默认语言

    cefsharp是不错的浏览器内核封装版本之一,默认语言是en-US,这个一直困扰着项目,项目好多处需修改,后来经多次尝试,才发现,原来设置默认语言这么简单. CefSharp.Settings se ...

  8. MMORPG大型游戏设计与开发(服务器 游戏场景 动态场景与副本)

    场景的内容讲解到今天算是暂时划上一个句号了,接下来为大家讲解的是AI部分(大型AI),如果有兴趣的朋友不妨持续关注这些文章,大家一起学习和进步.动态场景和副本是场景中特殊的类型,副本在这里想必已经是无 ...

  9. 【原】使用VirtIE6代替IE6

    做前端开发难免要使用IE6,相信很多朋友知道win7上是不支持安装IE6的,通常会使用IETester,要么在win7中安装虚拟机,在虚拟机中安装IE6. 分析下这2种方式: IETester:并不是 ...

  10. POJ2186 Popular Cows [强连通分量|缩点]

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31241   Accepted: 12691 De ...