基于数学形态学的汉字骨架提取算法 程志君1 杨德强2 这篇论文的效果号称的效果图如下:
我经过自己的验证,写的程序如下,如果我的理解有错误,还请各位写评论啊,
#include<opencv\cv.h> #include<opencv\highgui.h> void main() { IplImage *img = cvLoadImage("hello.jpg",0); IplImage *skele = cvCreateImage(cvGetSize(img),8,1); cvZero(skele); IplImage *open = cvCreateImage(cvGetSize(img),8,1); bool isEnd = false; int count = 0; int array_cross[] ={ 0, 0xff, 0, 0xff,0xff, 0xff, 0 ,0xff, 0 }; int arrayRect[]= { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; IplConvKernel * rectCross= cvCreateStructuringElementEx(3,3,1,1,CV_SHAPE_CROSS,array_cross); IplConvKernel* rectRect = cvCreateStructuringElementEx(3,3,1,1,CV_SHAPE_RECT,arrayRect); cvShowImage("开始的图像",img); //具体的运算过程。 for(count =0;isEnd ==false;count++) { cvErode(img,img,rectCross,count); //cvMorphologyEx(img,open,NULL,rectCross,CV_MOP_OPEN,1); cvMorphologyEx(img,open,NULL,rectRect,CV_MOP_OPEN,1); isEnd = true;//首先假设到了结束的条件 for(int i=0;i<img->height;i++) { uchar *ptrErode = (uchar *)(img->imageData+i*img->widthStep); uchar *ptrOpen = (uchar *)(open->imageData+i*open->widthStep); uchar *ptrSkele = (uchar *)(skele->imageData+i*skele->widthStep); for(int j=0;j<img->width;j++) { if( *(ptrErode+j) == 0xff && *(ptrOpen+j) ==0 ) { //isEnd = false; *(ptrSkele+j) = 0xff; }//if if(*(ptrErode +j) == 0xff) { isEnd = false; }//if }//width }//for height }//end cvShowImage("img",img); cvShowImage("skele",skele); //cvShowImage("img",img); //IplConvKernel * rectCross= cvCreateStructuringElementEx(3,3,1,1,CV_SHAPE_CROSS,array_cross); ////cvErode(img,img,rectCross,num);//形态学被腐蚀运算。 //cvMorphologyEx(img,img,NULL,rectCross,CV_MOP_OPEN,count);//形态学开运算。 //cvShowImage("腐蚀",img); cvWaitKey(); //释放内存。 cvReleaseStructuringElement(&rectCross); cvReleaseImage(&skele); cvReleaseImage(&open); cvReleaseImage(&img); }
原始图片:
最终提取的骨架:
可以看出有骨架都被分离开了。根本提取不出完整的骨架。,希望以后大家不要再上当了,