《OpenCV图像骨架提取》由会员分享,可在线阅读,更多相关《OpenCV图像骨架提取(4页珍藏版)》请在金锄头文库上搜索。
1、OpenCV 图像骨架提取/*/* 提取骨架*/*/ #include #include int main(void)IplImage *src;IplImage *distsrc;IplImage *out;IplImage *S00;IplImage *S45;IplImage *S90;IplImage *S135;CvMat kern00, kern45, kern90, kern135; float Smax=0;float L0=-1,-1,-1,-1,-1,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,-1,-1,-1,-1,-1;float L45=0,-1,-1
2、, 0, 2,-1,-1, 0, 2, 0,-1, 0, 2, 0,-1,0, 2, 0,-1,-1,2, 0,-1,-1, 0;float L90=-1, 0, 2, 0,-1,-1, 0, 2, 0,-1,-1, 0, 2, 0,-1,-1, 0, 2, 0,-1,-1, 0, 2, 0,-1;float L135=2, 0,-1,-1, 0,0, 2, 0,-1,-1,-1, 0, 2, 0,-1,-1,-1, 0, 2, 0,0,-1,-1, 0, 2;src=cvLoadImage(“OpenCVKasvandTest.png“,0); distsrc=cvCreateImage(c
3、vGetSize(src),IPL_DEPTH_32F,1); S00=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1); S45=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1); S90=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1); S135=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1); out=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1);/kernel 建立矩阵卷
4、积核cvInitMatHeader(&kern00,5,5,CV_32FC1,L0); cvInitMatHeader(&kern45,5,5,CV_32FC1,L45); cvInitMatHeader(&kern90,5,5,CV_32FC1,L90); cvInitMatHeader(&kern135,5,5,CV_32FC1,L135);/距离变换cvDistTransform(src,distsrc,CV_DIST_L2,5);/过滤,其实就是卷积cvFilter2D(distsrc,S00,&kern00); cvFilter2D(distsrc,S45,&kern45); cvF
5、ilter2D(distsrc,S90,&kern90); cvFilter2D(distsrc,S135,&kern135);/Smax = MAX(S00,S45,S90,S135)/ Smax, Smax = 0/ g = |/ 0 , others/for (int y=0; y height; y+) for (int x=0; xwidth; x+)Smax = MAX(MAX(float*)(S00-imageData + y* S00-widthStep)x, (float*)(S45-imageData + y* S45-widthStep)x),MAX(float*)(S9
6、0-imageData + y* S90-widthStep)x, (float*)(S135-imageData + y* S135-widthStep)x);(float*)(out-imageData + y* out-widthStep)x = Smax 0 ? Smax: 0.0;cvThreshold(out,out,7,1,CV_THRESH_BINARY); cvNamedWindow(“S00“,1); cvNamedWindow(“S45“,1); cvNamedWindow(“S90“,1); cvNamedWindow(“S135“,1); cvNamedWindow(
7、“out“,1);cvShowImage(“S00“,S00); cvShowImage(“S45“,S45); cvShowImage(“S90“,S90); cvShowImage(“S135“,S135); cvShowImage(“out“,out); cvWaitKey(0);cvCvtScaleAbs(S00,src,32,0); cvSaveImage(“S00.png“,src); cvCvtScaleAbs(S45,src,32,0); cvSaveImage(“S45.png“,src); cvCvtScaleAbs(S90,src,32,0); cvSaveImage(“S90.png“,src); cvCvtScaleAbs(S135,src,32,0); cvSaveImage(“S135.png“,src); cvCvtScaleAbs(out,src,255,0); cvSaveImage(“out.png“,src);return 0;对于简洁构造的图形可以简洁运用上述方法即可得到较好的骨架,对于略微简单的图形,或者干扰较大的图形,可以通过对原图进展屡次卷积,使得骨架信息变得更加突出,一般 34 次卷积效果较好。原图水平方向45 度方向90 度方向135 度方向最终结果曾经的这一天.