输入图像
输出图像
代码//计算图像的水平投影,并返回一幅图像 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);