《OpenCV图像骨架提取.docx》由会员分享,可在线阅读,更多相关《OpenCV图像骨架提取.docx(4页珍藏版)》请在三一办公上搜索。
1、OpenCV图像骨架提取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
2、, 0, 0, 0, -1,-1,-1,-1,-1 ; float L45= 0,-1,-1, 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 ; s
3、rc=cvLoadImage(OpenCVKasvandTest.png,0); distsrc=cvCreateImage(cvGetSize(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);
4、 out=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1); /kernel建立矩阵卷积核 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); /过滤,其实就是卷积
5、cvFilter2D(distsrc,S00,&kern00); cvFilter2D(distsrc,S45,&kern45); cvFilter2D(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
6、+ y* S00-widthStep)x, (float*)(S45-imageData + y* S45-widthStep)x), MAX(float*)(S90-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); cvNam
7、edWindow(S45,1); cvNamedWindow(S90,1); cvNamedWindow(S135,1); cvNamedWindow(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); cvSave
8、Image(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度方向 最终结果 曾经的这一天.