基于数学形态学的汉字骨架提取算法 程志君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);
}
我的运行效果如下:
原始图片:
最终提取的骨架:
可以看出有骨架都被分离开了。根本提取不出完整的骨架。,希望以后大家不要再上当了,