细化算法(查表法)

https://blog.csdn.net/Bryan_QAQ/article/details/88343814

#include<opencv2/opencv.hpp>
using namespace cv;

Mat ImgSkeletonization(Mat &input_src,Mat &output_dst,int number=20);
//@param  number :表示水平方向和垂直方向上“细化的次数”
Mat ImgSkeletonization_H(Mat &input_src,int *search_arr);//水平方向细化
Mat ImgSkeletonization_V(Mat &input_src,  int *search_arr);//垂直方向细化

int main()
{
	Mat src = imread("sap3.jpg");
	Mat src_gray, src_threshold;
	cvtColor(src, src_gray, CV_RGB2GRAY);
	threshold(src_gray, src_threshold, 170, 255,0);
	imshow("src_threshold", src_threshold);
	Mat dst;
	ImgSkeletonization(src_threshold, dst, 30);
	imshow("dst", dst);
	waitKey(0);
	return 0;
}
Mat ImgSkeletonization(Mat &input_src,Mat & output_dst, int number)
{
	output_dst = input_src.clone();
	int search_array[]= { 0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,\
		1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,\
		0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,\
		1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,\
		1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,\
		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
		1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,1,\
		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
		0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,\
		1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,\
		0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,\
		1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,\
		1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,\
		1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,\
		1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,0,\
		1,1,0,0,1,1,1,0,1,1,0,0,1,0,0,0 };
	for (size_t i = 0; i < number; i++)
	{
		ImgSkeletonization_H(output_dst, &search_array[0]);
		ImgSkeletonization_V(output_dst, &search_array[0]);
		
	}
	return output_dst;
}
Mat ImgSkeletonization_H(Mat &input_src, int *search_arr)
{
	int h = input_src.rows;
	int w = input_src.cols;
	bool NEXT = true;
	for (size_t j = 1; j < w - 1; j++)//注意边界问题!!!!!!
	{
		for (size_t i = 1; i < h - 1; i++)
		{
			if (!NEXT)
				NEXT = true;
			else
			{
				int judge_value;
				if (1 <i < h - 1)
					judge_value = input_src.at<uchar>(i - 1, j) + input_src.at<uchar>(i, j) + input_src.at<uchar>(i + 1, j);
				else
					judge_value = 1;
				if (input_src.at<uchar>(i, j) == 0 && judge_value != 0)
				{
					int a[9] = { 1,1,1,1,1,1,1,1,1};
					for (size_t m = 0; m < 3; m++)
					{
						for (size_t n = 0; n < 3; n++)
						{
							if ((0 <= (i - 1 + m) < h) && (0 <= (j - 1 + n) < w) && input_src.at<uchar>(i - 1 + m, j - 1 + n) == 0)
								a[m * 3 + n] = 0;
						}
					}
					int sum_value = a[0] * 1 + a[1] * 2 + a[2] * 4 + a[3] * 8 + a[5] * 16 + a[6] * 32 + a[7] * 64 + a[8] * 128;
					input_src.at<uchar>(i, j) = search_arr[sum_value] * 255;
					if (search_arr[sum_value] == 1)
						NEXT = false;
				}
			}
		}
	}
	return input_src;
}
Mat ImgSkeletonization_V(Mat &input_src, int *search_arr)
{
	int h = input_src.rows;
	int w = input_src.cols;
	bool NEXT = true;
	for (size_t i = 1; i < h - 1; i++)//注意边界问题!!!!!!
	{
		for (size_t j = 1; j < w - 1; j++)
		{
			if (!NEXT)
				NEXT = true;
			else
			{
				int judge_value;
				if (1 < j <w - 1)
					judge_value = input_src.at<uchar>(i, j - 1) + input_src.at<uchar>(i, j) + input_src.at<uchar>(i, j + 1);
				else
					judge_value = 1;
				if (input_src.at<uchar>(i, j) == 0 && judge_value != 0)
				{
					int a[9] = {1,1,1,1,1,1,1,1,1 };
					for (size_t m = 0; m < 3; m++)
					{
						for (size_t n = 0; n < 3; n++)
						{
							if ((0 <= (i - 1 + m) < h) && (0 <= (j - 1 + n) < w) && input_src.at<uchar>(i - 1 + m, j - 1 + n) == 0)
								a[m * 3 + n] = 0;
						}
					}
					int sum_value = a[0] * 1 + a[1] * 2 + a[2] * 4 + a[3] * 8 + a[5] * 16 + a[6] * 32 + a[7] * 64 + a[8] * 128;
					input_src.at<uchar>(i, j) = search_arr[sum_value] * 255;
					if (search_arr[sum_value] == 1)
						NEXT = false;
				}
			}
		}
	}
	return input_src;
}

编译:

g++ xihuachabiao.cpp -o xihuchabiao  `pkg-config opencv --cflags --libs`

注意上面命令行里的单引号。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值