void DoThinWithDistanceTransform(cv::Mat src, float thinScale, cv::Mat &distShow);
//
void DoThinWithDistanceTransform(cv::Mat src, float thinScale, cv::Mat &distShow)
{
float maxValue = 0; //定义距离变换矩阵中的最大值
Mat imageGray;
if (src.channels() == 3)
cvtColor(src, imageGray, CV_RGB2GRAY);
else
imageGray = src.clone();
imageGray = ~imageGray; //取反
GaussianBlur(imageGray, imageGray, Size(5, 5), 2); //滤波
threshold(imageGray, imageGray, 20, 200, CV_THRESH_BINARY); //阈值
Mat imageThin(imageGray.size(), CV_32FC1); //定义保存距离变换结果的Mat矩阵
distanceTransform(imageGray, imageThin, CV_DIST_L2, 3); //距离变换
distShow = Mat::zeros(imageGray.size(), CV_8UC1); //定义细化后的字符轮廓
for (int i = 0; i<imageThin.rows; i++)
{
for (int j = 0; j<imageThin.cols; j++)
{
if (imageThin.at<float>(i, j)>maxValue)
{
maxValue = imageThin.at<float>(i, j); //获取距离变换的极大值
}
}
}
for (int i = 0; i<imageThin.rows; i++)
{
for (int j = 0; j<imageThin.cols; j++)
{
if (imageThin.at<float>(i, j)>maxValue * thinScale)
{
distShow.at<uchar>(i, j) = 255; //符合距离大于最大值一定比例条件的点设为255
}
}
}
return;
}
main函数:
int main()
{
Mat src = imread("C:\\Users\\Administrator\\Desktop\\捕获.JPG");
float thinScale = 0.6;
Mat distShow;
distShow = Mat::zeros(src.size(), CV_8UC1); //定义细化后的字符轮廓
DoThinWithDistanceTransform(src, thinScale, distShow);
//namedWindow("show", 0);
//imshow("show", distShow);
//waitKey();
return 0;
}
结果:
原图:
结果图: