Opencv3.3-distanceTransform用于细化字符轮廓

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;
}

结果:

原图:

结果图:

猜你喜欢

转载自blog.csdn.net/zfjBIT/article/details/85066521