图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

什么叫图像的投影特征图?定义如下:

图像水平方向上的投影定义:就是每行的灰度累计值,这些值串起来就构成了水平方向上的投影曲线;

图像垂直方向上的投影定义:就是每列的灰度累计值,这些值串起来就构成了垂直方向上的投影曲线。

投影的波峰波谷查找的含义:就是查投影曲线的波峰波谷撒,其实就是曲线的极值点,想想高等数学中对于连续函数我们怎么求极值点的吧?就是求一阶和二阶导数啊!极值点其实就是一阶导数为0,二阶导数为正为负时,引用一下高等数学中的知识如下:

极值的充分条件
f在x0的某邻域上一阶可导,在x0处二阶可导,且f'(X0)=0,f"(x0)≠0
⑴若f"(x0)<0,则f在x0取得极大值
⑵若f"(x0)>0,则f在x0取得极小值

不过我们这里的投影曲线是离散的,那怎么办呢?那就求差分函数呗!所以这里用的查找方法的名称为“差分遍历向量法来实现波峰波谷的查找”,向量二字的含义是把投影曲线看成是向量。

查找波峰波谷的用处:

常用于图像分割、字符检测及提取、文本分类等领域。为什么有这样的作用?因为查到波峰或波谷就相当于是找到了字符的大概位置了啊!如果还不能理解,请看下面我给出的源码的运行结果。

源码如下(源码中用到的图的下载地址:test.jpg_免费高速下载|百度网盘-分享无限制):

图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!

//OpenCV版本2.4.9
//图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
//图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;
// 计算图像的波峰
void findPeak(cv::Mat srcImage, vector<int>& resultVec)
{cv::Mat verMat;cv::Mat resMat = srcImage.clone();// 阈值化操作int thresh = 130; int threshType = 0; // 预设最大值const int maxVal = 255;// 固定阈值化操作cv::threshold( srcImage, srcImage, thresh, maxVal , threshType );srcImage.convertTo(srcImage, CV_32FC1);// 计算垂直投影cv::reduce(srcImage, verMat, 0, CV_REDUCE_SUM);// std::cout << verMat << std::endl;// 遍历求差分符号函数float* iptr = ((float*)verMat.data) + 1;vector<int> tempVec(verMat.cols - 1, 0);for (int i = 1; i < verMat.cols - 1; ++i, ++iptr){if (*(iptr + 1) - *iptr >0)tempVec[i] = 1;else if (*(iptr + 1) - *iptr < 0)tempVec[i] = -1;elsetempVec[i] = 0;}// 对符号函数进行遍历for (int i = tempVec.size() - 1; i >= 0; i--){if (tempVec[i] == 0 && i == tempVec.size() - 1){tempVec[i] = 1;}else if (tempVec[i] == 0){if (tempVec[i + 1] >= 0)tempVec[i] = 1;elsetempVec[i] = -1;}}// 波峰判断输出for (vector<int>::size_type i = 0; i != tempVec.size() - 1;i++){if (tempVec[i + 1] - tempVec[i] == -2)resultVec.push_back(i + 1);} // 输出波峰位置std::cout <<"波峰位置 ";for(int i = 0; i< resultVec.size(); i++){std::cout << resultVec[i] << " ";//resMat.at(resultVec[i], resultVec[i]) = 255;for (int ii = 0; ii < resMat.rows; ++ii){resMat.at<uchar>(ii,resultVec[i])=255;}}imshow("resMat", resMat);
}
int main()
{cv::Mat image = imread("test.jpg",0);if(!image.data)return 0;imshow("Image", image);vector<int> resultVec;findPeak(image, resultVec);cv::waitKey(0);return 0;
}

对源码作几点补充说明:

1 图像计算的投影是垂直投影,而不是水平投影

2 只计算了波峰位置,没有计算波谷僧

运行结果如下图所示:

-------------------------------------------
图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

图像投影特征图的波峰波谷查找的相关原理及利用差分遍历法查找波峰的OpenCV代码相关推荐

  1. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(ubuntu g++)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请指明出于breakso ...

  2. PyQt5_寻找波峰波谷并可视化

    在K线图分析中经常需要查看波峰与波谷的情况,鉴别是否后续高点是否高于或低于前一个高点,后续低点是否高于或低于前一个低点:另一种情况是寻找曲线形态,诸如头肩顶(底).双重顶(底)等.在K线图中直接查找会 ...

  3. c语言检测正弦波波峰波谷,一种基于波峰波谷检测的计步算法的制作方法

    本发明涉及计步器算法领域,具体是一种基于波峰波谷检测的计步算法. 背景技术: 当今社会,健康越来越受到人们的重视,步行作为人类活动中最基础.最常见.最重要的运动形式,使得深入研究计步算法有着重要的意义 ...

  4. java 波峰检测_脉搏波波峰波谷自动检测方法

    脉搏波波峰波谷自动检测方法 [技术领域] [0001]本发明属人体健康监护技术领域,涉及一种脉搏波波峰波谷自动检测方法,尤其涉及脉搏波中存在大量人为.系统噪声以及心率快速变化的情况.可用于临床心电图自 ...

  5. FPN:特征图金字塔网络

    1. 论文简介 论文名:Feature Pyramid Networks for Object Detection 论文地址 :FPN 论文作者:Tsung-Yi Lin, Piotr Dollar, ...

  6. Pytorch可视化语义分割特征图

    简介 深度学习中有时候可视化特征图是必要的,特别是对于语义分割任务,合理分析特征图也许能够发现新的idea!接下来讲解一种Pytorch框架下的可视化方法,这里采取的网络模型为Deeplabv3+,首 ...

  7. 【每日一题】排序子序列(波峰波谷问题)

    [每日一题]排序子序列(波峰波谷问题) 文章目录 [每日一题]排序子序列(波峰波谷问题) 1.题目来源 2.题目描述 3.输入/出描述 4.示例 5.解题思路 5.1 非递增非递减序列 5.2 访问边 ...

  8. 利用MSER算法提取图像区域(车牌区域)的OpenCV代码~

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 我的博客中前面已经写了两种方法来实现车牌区域的提 ...

  9. Java版二叉树遍历,查找,顺序化存储代码实现

    前中后序遍历,查找 package Tree; /*** 二叉树前 中 后 遍历,查找* @author bai**/ public class BinaryTreeDemo {public stat ...

最新文章

  1. 飞行时间(TOF)相机优缺点及其应用领域
  2. mac curl命令下载文件
  3. Linux 命令行的聊天工具 CenterIM
  4. 稳定wow60级服务器,魔兽怀旧服:永久60级怀旧服是什么体验?
  5. Linux下批量重命名的方法
  6. 基于Jenkins的持续交付全流程设计与实践
  7. raptor累乘流程图_Markdown快速上手指南
  8. 树莓派安装mosquitto提示“MOSQ_1.5” not found
  9. 百度现场面试:JVM+算法+Redis+数据库!(三面)| CSDN博文精选
  10. C++学习随笔之一:基础
  11. C#委托和事件的应用Observer模式实例
  12. 判定2022年是否闰年c语言_闰年的来历
  13. Java Lock的使用
  14. 容器技术Docker K8s 22 容器服务ACK基础与进阶-存储管理
  15. js使用xlsx读取excel文件
  16. 数据库语句创建数据库
  17. oracle oaf界面个性化,OAF—个性化和扩展维护
  18. GPU Pro 7——实时体积云(翻译,附Unity工程)
  19. Python爬虫小项目——实现英语翻译功能(四)
  20. 《软技能》读书笔记——生产力篇

热门文章

  1. python下载安装教程mac-mac上如何安装python3
  2. python 3.5-python3.5
  3. 精通python爬虫框架-精通Python爬虫框架Scrapy PDF 中文清晰版
  4. 我在学python-你们以为我在学C++?其实我在学 Python
  5. python装饰器实例-python装饰器实例大详解
  6. python飞机大战源代码-python飞机大战源码和素材
  7. python打开一个文件-在“Python”中如何“尝试/抓住”打开一个文件?
  8. python工程师薪资坑吗-最新Python面试经验总结,避免采坑的进来
  9. python推荐书-Python 阅读书目推荐
  10. python游戏脚本实例-python实现的简单文本类游戏实例