您的位置:首页 > 其它

自己验证的一片扯淡的骨架提取论文

2013-08-02 10:49 417 查看
基于数学形态学的汉字骨架提取算法    程志君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);
}

我的运行效果如下:
原始图片:



最终提取的骨架:



可以看出有骨架都被分离开了。根本提取不出完整的骨架。,希望以后大家不要再上当了,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: