FROM:http://www.cnblogs.com/ronny/p/3616470.html

1. 前言

在图像分析里,投影曲线是我们经常要用到的一个图像特征,通过投影曲线我们可以看到在某一个方向上,图像灰度变化的规律,这在图像分割,文字提取方面应用比较广。一个投影曲线,它的关键信息就在于波峰与波谷,所以我们面临的第一个问题就是找到波峰与波谷。

第一次涉及到求波峰与波谷时,很多人都不以为意,觉得波谷波峰还不容易,无非是一些曲线变化为零的点,从离散的角度来说,也就是:

波峰:F(x)>F(x−1)且F(x)>F(x+1)

波谷:F(x)<F(x−1)且F(x)<F(x+1)

这么简单吗?显示不是,你首先就会遇到这样的曲线图,然后图上的波峰点并不满足上面的条件。

看到这种情况,你也许会考虑在上面的等式中把>和<改为≥和≤。

波峰:F(x)≥F(x−1)&&F(x)>F(x+1)  或者 F(x)>F(x−1)&&F(x)≥F(x+1)

波谷:F(x)≤F(x−1)&&F(x)<F(x+1)  或者 F(x)<F(x−1)&&F(x)≤F(x+1)

这次是否就这样简单,答案显示不是,下面的这个图就会让你对一些非峰值点作出错误的判断。

上面这幅图真正的峰值只有一个,其他平台上的点,你如果按上面修改的公式,就会被错误的当成波峰点。

下面让我们看一下,到底如何能求得准确的曲线波峰与波谷。

2. 波峰波谷算法

投影曲线实际上是一个一维的向量:

V=[v1,v2,…,vn]

其中vi,i∈[1,2,…,N],代表图像在第i行或列上的灰度累积。当然不仅仅是投影曲线,T也可以是某一事件中变量的观测值,我们需要研究这个变量的变化规律。

下面给出波峰与波谷的算法:

1,假投影曲线可以表示为V=[v1,v2,…,vn]。

2,计算V的一阶差分向量DiffV:

Diffv(i)=V(i+1)−V(i),其中i∈1,2,…,N−1

3,对差分向量进行取符号函数运算,Trend=sign(Diffv),即遍历Diffv,若Diffv(i)大于0,则取1;如果小于0,则取-1,否则则值为0。

sign(x)=⎧⎩⎨⎪⎪10−1  if  x>0  if  x=0  if  x<0

4,从尾部遍历Trend向量,进行如下操作:

if Trend(i)=0且Trend(i+1)≥0,则Trend(i)=1if Trend(i)=0且Trend(i+1)<0,则Trend(i)=−1

5,对Trend向量进行一阶差分运算,如同步骤2,得到R=diff(Trend)。

6,遍历得到的差分向量R,如果R(i)=−2,则i+1为投影向量V的一个峰值位,对应的峰值为V(i+1);如果R(i)=2,则i+1为投影向量V的一个波谷位,对应的波谷为V(i+1)。

下面我们来结合一个实际的向量值,给中中间结合的计算。

1,V=[−5,10,10,14,14,8,8,6,6,−3,2,2,2,2,−3]。

它的曲线图像如下把示,图中红色圈标出了曲线的峰值,而绿字圈标出了图像的波谷位置。

2,计算V的一阶差分,我们得到Diff(V)=[15,0,4,0,,−6,0,−2,0,−9,5,0,0,0,−5]。

3,对Diffv进行取符号运算,得到向量Trend=[1,0,1,0,−1,0,−1,0,−1,1,0,0,0,−1]。

4,对Trend作一次遍历,如步骤4。Trend=[1,1,1,−1,−1,−1,−1,−1,−1,1,−1,−1,−1,−1]。

5,对Trend做一阶差分,得到向量R=Diff(Trend)=[0,0,−2,,0,0,0,0,0,2,−2,0,0,0]。

6,遍历向量R,我们就得到了两个峰值点和一个波谷点。

3. 算法原理

其实上述算法的核心思路非常简单,曲线的峰值点,满足一阶导数为0,并且满足二阶导数为负;而波谷点,则满足一阶导数为0,二阶导数为正。

在上面的算法里面,我们首先计算了一阶的导数Diffv,然后我们将其符号化,是因为我们并不关心一阶导数的大小。

然后我们去看那些一阶层数为0的地方,我们发现,那些平台上的点,有些并不是波峰与波谷,然后很多处在上坡与下坡的路上,所以我们将它们的一阶导数设为与它们所在的坡面梯度方向相同。

最后我们再来计算二阶导数时,就会发现只要为2或者-2,所以曲线斜在这个点发生了变化,由正变负或由负变正。找到这些点,也就找到了原曲线中的波峰或波谷点。

4. 实现

下面给出这个算法的C++实现,findPeaks是查找波峰函数,而查找波谷函数则类似,这里没有写在一个函数内。函数接受一个Vecotr<int>的向量,输出为一个vector<int>的位置向量。

void findPeak(const vector<int>& v, vector<int>& peakPositions)
{vector<int> diff_v(v.size() - 1, 0);// 计算V的一阶差分和符号函数trendfor (vector<int>::size_type i = 0; i != diff_v.size(); i++){if (v[i + 1] - v[i]>0)diff_v[i] = 1;else if (v[i + 1] - v[i] < 0)diff_v[i] = -1;elsediff_v[i] = 0;}// 对Trend作了一个遍历for (int i = diff_v.size() - 1; i >= 0; i--){if (diff_v[i] == 0 && i == diff_v.size() - 1){diff_v[i] = 1;}else if (diff_v[i] == 0){if (diff_v[i + 1] >= 0)diff_v[i] = 1;elsediff_v[i] = -1;}}for (vector<int>::size_type i = 0; i != diff_v.size() - 1; i++){if (diff_v[i + 1] - diff_v[i] == -2)peakPositions.push_back(i + 1);}
}

图像分析:投影曲线的波峰查找相关推荐

  1. Solidworks如何创建投影曲线

    画好草图之后(草图是在上视基准面上画的)然后点击曲线,投影曲线 面选择要投影的曲面,然后就得到了平面曲线在曲面上的投影得到的空间曲线 注意这种方法对于开环轮廓也是可以用的,比如下面,我定义一个开环的样 ...

  2. UG NX 12 组合投影曲线

    该工具是组合两个现有曲线链的投影交集,以创建曲线.其实质即是在同一截面上,两条曲线上的各个点在各自矢量方向上相交于一点,将这些点连接起来,得出的曲线即为两条曲线组合投影创建的曲线,也可以是曲面或实体的 ...

  3. 中望3D2022 X 草图命令——投影曲线(投影点)

    可将草图外的曲线.边或点沿着草图平面的法线投影到草图上. 投影曲线对话框: 2D草图"外部参考" 2D草图环境下,"外部参考"命令改进后,外部参考的方式分为投影 ...

  4. C#实现局部峰值查找,功能对应Matlab中的findpeaks.m

    C#实现局部峰值查找,功能对应Matlab中的findpeaks.m 原文:C#实现局部峰值查找,功能对应Matlab中的findpeaks.m 相关算法的原理参考Ronny,地址:图像分析:投影曲线 ...

  5. 二阶导数求信号波峰波谷算法

    最近在整理提取信号波峰波谷的算法原理,于是,在网上看到了一篇博文(链接见文末),写的比较清楚,方法也不难,就是利用二阶导数来求函数极值的问题,只是对于信号处理来说,这个过程是离散的. 博文中的问题背景 ...

  6. OpenCV进阶之路:神经网络识别车牌字符

    1. 关于OpenCV进阶之路 前段时间写过一些关于OpenCV基础知识方面的系列文章,主要内容是面向OpenCV初学者,介绍OpenCV中一些常用的函数的接口和调用方法,相关的内容在OpenCV的手 ...

  7. C# 实现寻峰算法的简单优化(包含边峰,最小峰值,峰距)

    核心寻峰算法的原理参考Ronny,链接:投影曲线的波峰查找, C#翻译原理代码参考sowhat4999,链接:C#翻译Matlab中findpeaks方法 前人种树,后人乘凉.感谢原作者详细的解释说明 ...

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

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 什么叫图像的投影特征图?定义如下: 图像水平方向 ...

  9. 信号识别-波峰波谷二阶差分识别算法

    信号识别-波峰波谷二阶差分识别算法 前言 波峰波谷算法 实际上代码 前言 在图像分析里,投影曲线是我们经常要用到的一个图像特征,通过投影曲线我们可以看到在某一个方向上,图像灰度变化的规律,这在图像分割 ...

最新文章

  1. ​NVIDIA针对数据不充分数据集进行生成改进,大幅提高CIFAR-10数据生成
  2. 什么是进程?Python进程各部分内容介绍
  3. android下创建文件夹和修改其权限的方法
  4. 领域应用 | NLP 和知识图谱:金融科技领域的“双子星”
  5. django-模板文件加载顺序
  6. U2Net基于ModelArts Notbook的仿真实验
  7. 萌新的Python练习菜鸟100例(九)暂停一秒输出
  8. Android实战简易教程-第七十三枪(拨打、接听电话自动免提)
  9. HDU1269-迷宫城堡
  10. Mybatis 框架CRUD的操作 案例
  11. nvm安装、下载以及nvm使用教程
  12. 五路DI五路DO,网络继电器,Modbus TCP远程IO模块 WJ95
  13. 以下代码中的两个sizeof用法有问题吗?
  14. matlab基础教程实验报告,Matlab基础实验报告.doc
  15. C - Emojis Gym - 102566C题解
  16. PC上一款非常好用的PDF阅读器,支持免费格式转换、支持云端同步
  17. 《Linux命令行大全》学习笔记2——配置与环境
  18. 编写简单php表单,用PHP做一个简单的表单
  19. MAC下快捷键、指令(持续更新。。。)
  20. 日常-工作上的那点事儿

热门文章

  1. opsforlist 存在贼覆盖_RedisTemplate常用集合使用说明-opsForList(三)
  2. leetcode算法题--Decode String
  3. C/C++中链接属性
  4. python生成激活码
  5. mysql如何算值_如何计算MySQL中具有特定值的列数?
  6. ceph pool 管理(基础操作)
  7. KotlinPoet
  8. mysql基本操作(重点)
  9. 存储--盘古_阿里云飞天分布式存储系统设计深度解析
  10. IDC:以太网交换机市场增长2%