效果图

输入图像

C++ opencv计算图像的水平投影,并返回一幅图像_分享

输出图像

C++ opencv计算图像的水平投影,并返回一幅图像_分享_02

代码
//计算图像的水平投影,并返回一幅图像
cv::Mat getVerProjImage(const cv::Mat &image)
{
	cv::Mat matTmp = image.clone();
	int maxCol = 0, maxNum = 0;//重置255最大数目和最大行
	int minCol = 0, minNum = matTmp.rows;//重置255最小数目和最小行
	int height = matTmp.rows, width = matTmp.cols;//图像的高和宽
	int tmp = 0;//保存当前行的255数目
	int *projArray = new int[width];//保存每一行255数目的数组

	cv::namedWindow("matTmp", 0);
	cv::imshow("matTmp", matTmp);

	//循环访问图像数据,查找每一行的255点的数目
	for (int col = 0; col < width; ++col)
	{
		tmp = 0;
		for (int row = 0; row < height; ++row)
		{
			if (matTmp.at<uchar>(row, col) == 255)/*白色像素*/
			{
				++tmp;
			}
		}
		projArray[col] = tmp;
		if (tmp > maxNum)
		{
			maxNum = tmp;
			maxCol = col;
		}
		if (tmp < minNum)
		{
			minNum = tmp;
			minCol = col;
		}
	}
	//创建并绘制垂直投影图像
	cv::Mat projImg(height, width, CV_8U, cv::Scalar(255));

	for (int col = 0; col < width; ++col)
	{
		cv::line(projImg, cv::Point(col, height - projArray[col]), cv::Point(col, height - 1), cv::Scalar::all(0));
	}

	delete[] projArray;//删除new数组
	return  projImg;
}

使用示例:

	Mat VerProjImage;

	//计算图像的水平投影,并返回一幅图像
	VerProjImage = getVerProjImage(image_part);