汉字骨架线提取算法源码
时间: 2023-08-25 19:06:11 浏览: 116
以下是一个基于分水岭算法的汉字骨架线提取的C++源码示例,供参考:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
// 骨架提取函数
void SkeletonExtraction(Mat& src, Mat& dst)
{
// 二值化
threshold(src, src, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
// 距离变换
Mat dist;
distanceTransform(src, dist, DIST_L2, 3);
normalize(dist, dist, 0, 1.0, NORM_MINMAX);
// 分水岭算法
Mat markers;
watershed(dist, markers);
// 骨架提取
dst = Mat::zeros(src.size(), CV_8UC1);
for (int i = 0; i < markers.rows; i++)
{
for (int j = 0; j < markers.cols; j++)
{
if (markers.at<int>(i, j) == -1)
{
dst.at<uchar>(i, j) = 255;
}
}
}
}
int main()
{
// 读取图像
Mat src = imread("chinese-character.jpg");
if (src.empty())
{
return -1;
}
// 骨架提取
Mat skel;
SkeletonExtraction(src, skel);
// 显示结果
imshow("Original Image", src);
imshow("Skeleton Image", skel);
waitKey();
return 0;
}
```
该示例中使用了OpenCV库中的距离变换函数、分水岭算法函数和二值化函数,通过对输入图像进行二值化处理,然后计算距离变换,然后对距离变换图像进行分水岭算法,得到分割后的图像,最后取分割后的图像中的-1像素,得到汉字的骨架线,将结果显示出来。需要注意的是,该示例中使用的是L2范数,如果需要使用L1范数,需要将DIST_L2改为DIST_L1。
阅读全文