投影曲线的波峰查找(图像分析)
来源:互联网 发布:北京java程序员的工资表 编辑:程序博客网 时间:2024/05/07 03:12
1. 前言
在图像分析里,投影曲线是我们经常要用到的一个图像特征,通过投影曲线我们可以看到在某一个方向上,图像灰度变化的规律,这在图像分割,文字提取方面应用比较广。一个投影曲线,它的关键信息就在于波峰与波谷,所以我们面临的第一个问题就是找到波峰与波谷。
第一次涉及到求波峰与波谷时,很多人都不以为意,觉得波谷波峰还不容易,无非是一些曲线变化为零的点,从离散的角度来说,也就是:
波峰:
波谷:
这么简单吗?显示不是,你首先就会遇到这样的曲线图,然后图上的波峰点并不满足上面的条件。
看到这种情况,你也许会考虑在上面的等式中把
波峰:
波谷:
这次是否就这样简单,答案显示不是,下面的这个图就会让你对一些非峰值点作出错误的判断。
上面这幅图真正的峰值只有一个,其他平台上的点,你如果按上面修改的公式,就会被错误的当成波峰点。
下面让我们看一下,到底如何能求得准确的曲线波峰与波谷。
2. 波峰波谷算法
投影曲线实际上是一个一维的向量:
其中
下面给出波峰与波谷的算法:
1,假投影曲线可以表示为
2,计算V的一阶差分向量
3,对差分向量进行取符号函数运算,
4,从尾部遍历
5,对
6,遍历得到的差分向量
下面我们来结合一个实际的向量值,给中中间结合的计算。
1,
它的曲线图像如下把示,图中红色圈标出了曲线的峰值,而绿字圈标出了图像的波谷位置。
2,计算
3,对
4,对
5,对
6,遍历向量
3. 算法原理
其实上述算法的核心思路非常简单,曲线的峰值点,满足一阶导数为0,并且满足二阶导数为负;而波谷点,则满足一阶导数为0,二阶导数为正。
在上面的算法里面,我们首先计算了一阶的导数
然后我们去看那些一阶层数为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的一阶差分和符号函数trend for (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; else diff_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; else diff_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、图像分析:投影曲线的波峰查找
网址:http://www.cnblogs.com/ronny/p/3616470.html
http://blog.csdn.net/kezunhai/article/details/39047745
- 图像分析:投影曲线的波峰查找
- 图像分析:投影曲线的波峰查找
- 图像分析:投影曲线的波峰查找
- 图像分析:投影曲线的波峰查找
- 图像分析:投影曲线的波峰查找
- 投影曲线的波峰查找(图像分析)
- 投影曲线的波峰查找
- 投影曲线的波峰查找
- 图像投影特征图的波峰波谷查找的相关原理及利用差分遍历法查找波峰的OpenCV代码
- 投影波峰查找
- 如何用Opencv求图像的灰度投影曲线
- 统计曲线怎么找波峰
- 计算图像波峰点
- 实现纸张的曲线投影效果
- [OpenCV]图像的投影校正
- 二值图像的投影
- 图像水平方向的投影
- 图像的柱面投影纠正
- Eclipse设置TAB和编码
- leetcode 【287 Find the Duplicate Number】【Python】
- easyui 的行展开
- 用Unity做游戏,你需要深入了解一下IL2CPP(一)
- 使用HttpURLConnection抓网页代码示例
- 投影曲线的波峰查找(图像分析)
- CI 文件上传类的路径问题
- 如何建立数据分析中心
- 最小二乘法和梯度下降法有哪些区别? 以及梯度下降法Python实现
- webpack 在开发还是上线的时候都支持soucemap的功能 学习心得
- Ubuntu 14.04利用tasksel安装配置lamp环境
- Linux文件分割与合并
- 图片缩放时java.lang.IllegalArgumentException: pointerIndex out of range解决方案
- 二维裁剪