基于C++和OpenCV的中心线提取算法

加权平方灰度重心法介绍

在这里插入图片描述
在这里插入图片描述
详情见 https://blog.csdn.net/u010518385/article/details/101015604

算法演示

下面展示 函数-输入图像和阈值,输出点

void get_median_line(Mat& src, int thresh, vector<Point2d>& points){
	if (src.empty())
		return;
	// 一、图像处理
	Mat filterImg;
	cvtColor(src, src, CV_BGR2GRAY);	// 原图像如果是RGB3通道图像,需要变化为灰度图像
	blur(src, filterImg, Size(5, 5), Point(-1, -1));	// 均值滤波

	// 二、提取中心线
	for (int j = 0; j < filterImg.cols; ++j){
		double sum_value = 0.0;
		double sum_value_coor = 0.0;
		vector<double> current_value;
		vector<double> current_value_coor;
		for (int i = 0; i < filterImg.rows; ++i){
			double current = filterImg.ptr<uchar>(i)[j];
			// 将符合阈值的点的灰度值和纵坐标存入数组
			if (current > thresh){
				current_value.push_back(current);
				current_value_coor.push_back(i);
			}
		}
		// 计算灰度重心
		for (int k = 0; k < current_value.size(); ++k){
			sum_value_coor += pow(current_value[k], 2) * current_value_coor[k];
			sum_value += pow(current_value[k], 2);
		}
		double y = sum_value_coor / sum_value;
		Point2d point(j, 0);	// 默认纵坐标为 0
		if (y < filterImg.rows && y > 0){
			point.y = y;	// 纵坐标存在则存入 point
		}
		points.push_back(point);

		current_value.clear();	// 清空临时数组
		current_value_coor.clear();
	}
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐