本文介绍使用opencv实现计算一幅图像的水平投影和垂直投影,代码如下:

class HorizontalProjection
{
private:int maxLine;//255最大行位置int maxNum;//255最多的数目int minLine;//0最大行位置int minNum;//0最多的数目
public:HorizontalProjection();//构造函数cv::Mat getHorProjImage(const cv::Mat &image, int threshold);//计算图像的水平投影,并返回一幅图像
};//构造函数
HorizontalProjection::HorizontalProjection()
{maxLine = 0;//255最大行位置maxNum = 0;//255最多的数目minLine = 0;//0最大行位置minNum = 0;//0最多的数目
}//计算图像的水平投影,并返回一幅图像
cv::Mat HorizontalProjection::getHorProjImage(const cv::Mat &image, int threshold)
{cv::Mat matTmp = image.clone();if (image.channels() > 1){cvtColor(matTmp, matTmp, CV_RGB2GRAY);//彩色图转为灰度图}maxLine = 0, maxNum = 0;//重置255最大数目和最大行minLine = 0, minNum = matTmp.cols;//重置255最小数目和最小行int height = matTmp.rows, width = matTmp.cols;//图像的高和宽int tmp = 0;//保存当前行的255数目int *projArray = new int[height];//保存每一行255数目的数组cv::threshold(matTmp, matTmp, threshold, 255, CV_THRESH_BINARY);//对图形进行二值化处理//循环访问图像数据,查找每一行的255点的数目for (int i = 0; i < height; ++i){tmp = 0;for (int j = 0; j < width; ++j){if (matTmp.at<uchar>(i, j) == 255){++tmp;}}projArray[i] = tmp;if (tmp > maxNum){maxNum = tmp;maxLine = i;}if (tmp < minNum){minNum = tmp;minLine = i;}}//创建并绘制水平投影图像cv::Mat projImg(height, width, CV_8U, cv::Scalar(255));for (int i = 0; i < height; ++i){cv::line(projImg, cv::Point(width - projArray[i], i), cv::Point(width - 1, i), cv::Scalar::all(0));}delete[] projArray;//删除new数组return  projImg;
}

结果如下:

水平投影图:

垂直投影的代码如下:

class VerticalProjection
{
private:int maxCol;//255最大行位置int maxNum;//255最多的数目int minCol;//0最大行位置int minNum;//0最多的数目
public:VerticalProjection();//构造函数cv::Mat getVerProjImage(const cv::Mat &image, int threshold);//计算图像的水平投影,并返回一幅图像
};//构造函数
VerticalProjection::VerticalProjection()
{maxCol= 0;//255最大行位置maxNum = 0;//255最多的数目minCol = 0;//0最大行位置minNum = 0;//0最多的数目
}//计算图像的水平投影,并返回一幅图像
cv::Mat VerticalProjection::getVerProjImage(const cv::Mat &image, int threshold)
{cv::Mat matTmp = image.clone();if (image.channels() > 1){cvtColor(matTmp, matTmp, CV_RGB2GRAY);//彩色图转为灰度图}if (threshold == -1){threshold = GetThresholdByOtsu(matTmp);//使用大津算法计算阈值}maxCol = 0, maxNum = 0;//重置255最大数目和最大行minCol = 0, minNum = matTmp.rows;//重置255最小数目和最小行int height = matTmp.rows, width = matTmp.cols;//图像的高和宽int tmp = 0;//保存当前行的255数目int *projArray = new int[width];//保存每一行255数目的数组cv::threshold(matTmp, matTmp, threshold, 255, CV_THRESH_BINARY);//对图形进行二值化处理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;
}

结果如下:

opencv计算图像的水平投影和垂直投影相关推荐

  1. C++ opencv计算图像的水平投影,并返回一幅图像

    效果图 输入图像 输出图像 代码 //计算图像的水平投影,并返回一幅图像 cv::Mat getVerProjImage(const cv::Mat &image) {cv::Mat matT ...

  2. opencv学习---计算图像的水平积分投影和垂直积分投影

    opencv学习---计算图像的水平积分投影和垂直积分投影 标签: opencv水平积分投影垂直积分投影 2016-12-07 18:48 1806人阅读 评论(1) 收藏 举报 分类: opencv ...

  3. opencv java水平投影_使用OpenCv中Mat进行水平投影与垂直投影并实现字符切分

    由于要做图像的处理,所以最近在学习Opencv的相关知识,学习了Opencv中的Mat对象,查阅了网上的资料,了解了相关知识.现在实现了一个使用Mat对象来进行图像的水平投影与垂直投影,并在此基础之上 ...

  4. OpenCV 实现图片的水平投影与垂直投影,并进行行分割

    前言:对于印刷体图片来说,进行水平投影和垂直投影可以很快的进行分割,本文在OpenCV中如何进行水平投影和垂直投影通过代码进行说明. 水平投影:二维图像在y轴上的投影 垂直投影:二维图像在x轴上的投影 ...

  5. [机器视觉]gocv图像水平投影和垂直投影

    文章目录 1. 水平投影和垂直投影 2. 投影原理 3. 代码实现 1. 水平投影和垂直投影 图像水平投影和垂直投影效果如下图所示: 原图: 水平投影: 垂直投影: 2. 投影原理 投影原理很简单,比 ...

  6. 图像水平投影和垂直投影,图像分割

    图像水平投影和垂直投影,图像分割 // opencv.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // //#pragma comment(lib , ...

  7. 使用Python、OpenCV翻转图像(水平、垂直、水平垂直翻转)

    使用Python.OpenCV翻转图像(水平.垂直.水平垂直翻转) 1. 效果图 2. 源码 参考 这篇博客将介绍如何使用Python.OpenCV翻转图像,类似于cv2.rotate(). 沿y轴水 ...

  8. 使用Python,OpenCV计算图像直方图(cv2.calcHist)

    使用Python,OpenCV计算图像直方图(cv2.calcHist 1. 效果图 2. 原理 2.1 什么是图像直方图? 2.2 计算直方图 2.3 可视化蒙版区域 3. 源码 参考 这篇博客将介 ...

  9. python图片相似度计算_python Opencv计算图像相似度过程解析

    这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.相关概念 一般我们人区分谁是谁 ...

最新文章

  1. mysql 5.5.安装包_Mysql的详细安装教程!亲测可用!!!
  2. php mvc多态实例,asp.net mvc-多态模型绑定
  3. “约见“面试官系列之各系列目录汇总(建议学习收藏)
  4. HDU 4920 Matrix multiplication(矩阵相乘)
  5. WinForm始终置顶并获取焦点
  6. 王道 —— 操作系统的运行机制和体系结构
  7. 【BootStrap笔记】BootStrap+css写旅游网页面
  8. mysql在网页上显示乱码_计算机毕设答辩时网页报错怎么办
  9. Spark实现jieba中文分词(scala)
  10. 计算机怎样用PS抠婚纱图,用PS应该怎样抠出透明婚纱照片
  11. β版本展示博客-第二组(攻城喵组)
  12. python制作ico图标_python使用PythonMagic k将jpg图片转换成ico图片的方法
  13. 适合创业起步看的书推荐
  14. 【STM32F407开发板用户手册】第7章 STM32F407下载和调试方法(IAR8)
  15. Git 入门到精通,大厂程序员呕心沥血强力推荐
  16. 各个数据库中,查询前n条记录的方法
  17. 【深入理解TcaplusDB技术】TcaplusDB机器如何初始化和上架
  18. APP架构一般性分类
  19. 计算机网络复习——第四章:网络层——数据平面
  20. N8个E6诺基亚近期搞什么怪?

热门文章

  1. Element ui Dialog 对话框遮罩层挡住对话框问题
  2. 独立站斗篷技术是什么
  3. 《当程序员的那些狗日日子》(五十六)步入正轨
  4. Javascript 从ES5到ES7 - 14 类型运算
  5. js 当天24小时倒计时
  6. 一文读懂什么是阿里云OSS,如何使用Java操作阿里云OSS?
  7. runtime.js
  8. GPRS连接阿里云物联网平台四
  9. 话说当时武松踏住蒋 水浒传
  10. Downie 4 for Mac(最好用的视频下载软件)