最近在做课题研究的时候,在三维曲面寻找波峰方面遇到了些困难,虽然查找资料的时候有看到findpeaks和imregionalmax两个找极大值的函数,要么就是只适用于二位曲线,要么就是不能很好地滤除噪声引起的无效波峰,最后偶然看到一个大佬的思想,给了我很大的启发。

本文参考波峰识别算法介绍 | Zealseeker's Blog中的峰突prominence思想,对该识别算法进行说明改进,以利用MATLAB工具实现三维曲面中的有效波峰标定。

参考文章中对二维曲线进行举例说明,如下图所示,共有5个可见波峰,有效波峰用o表示,噪声引起的无效波峰用x表示,最大高度为5个单位长度。

假设对第3个x波峰进行检测,计算该点向左的波谷left_base,从波峰依次向左前进,若识别到该点比前一个点的高度更低,则继续向左前进,直至到达波谷,认为该点为left_base,同理向右前进可以得到right_base。

然后计算峰突强度(即峰突出的强度)prominence,假设该波峰x的高度为h,则

prominence=min(h-left_base,h-right_base)

可以得到,该波峰的left_base=3-2=1,right_base=3-1=2,则prominence=min(1,2)=1。

此时我们便可以根据实际情况设置阈值,滤除所有prominence小于阈值的波峰,例如上图中可以设阈值threshold=3,则三个x波峰都将被作为噪声滤除。

基于上述思想,同理可以寻找三维曲面中的有效波峰,首先用3*3窗口找出所有极大值(边界默认不是极值),然后计算每个极大值的prominence,由于是三维曲面,为了增加寻峰的有效性,除了左右两个波谷,还另加上前后两个波谷,最后取4个差值中的最小值作为prominence,再根据需求设定阈值便可以去除无效波峰啦~

上图为直接使用imregionalmax函数所得到的波峰(红点标记)。

上图为通过计算峰突强度prominence所得到的波峰(红点标记)。

比较两种方法,本文所述方法较好地滤除了噪声引起的无效波峰。

以下为本人手敲的函数代码,需要的自取,若有好的建议或是还有哪些更好的寻峰方法,还请各位大佬不吝赐教。

function peaks = findPeak_3D(Z,threshold)
% 基于峰突强度,找出二维数据中的波峰,Z为输入的二维数据(即曲面各点的高度),threshold为峰突强度阈值,
% 若对应极大值点的峰突强度大于所设阈值,则视为波峰。
% 返回大小与Z一致的二值矩阵SM,0代表不是波峰,1代表是波峰,边界默认为0。m_size = size(Z);
width = m_size(1);
len = m_size(2);
peaks = zeros(width,len);for i = 2:width-1for j = 2:len-1if Z(i,j)>=Z(i-1,j) && Z(i,j)>=Z(i+1,j) && Z(i,j)>=Z(i,j-1) &&...Z(i,j)>=Z(i,j+1) && Z(i,j)>=Z(i-1,j+1) && Z(i,j)>=Z(i+1,j+1) &&...Z(i,j)>=Z(i-1,j-1) && Z(i,j)>=Z(i+1,j-1) % 检测3*3窗口极大值peaks(i,j) = 1;endend
end% 通过前后左右4个波谷计算峰突强度prominence
[x,y] = find(peaks == 1);  % 极大值坐标
for i = 1:length(x)count = 1;while Z(x(i),y(i)-count) < Z(x(i),y(i)-count+1)count = count + 1;if y(i)-count <= 0break;endendleft_base = Z(x(i),y(i)-count+1);   % 左波谷count = 1;while Z(x(i),y(i)+count) < Z(x(i),y(i)+count-1)count = count + 1;if y(i)+count >= len-1break;endendright_base = Z(x(i),y(i)+count-1);   % 右波谷count = 1;while Z(x(i)-count,y(i)) < Z(x(i)-count+1,y(i))count = count + 1;if x(i)-count <= 0break;endendformer_base = Z(x(i)-count+1,y(i));   % 前波谷count = 1;while Z(x(i)+count,y(i)) < Z(x(i)+count-1,y(i))count = count + 1;if x(i)+count >= width-1break;endendlater_base =  Z(x(i)+count-1,y(i));   % 后波谷a = Z(x(i),y(i))-left_base;b = Z(x(i),y(i))-right_base;c = Z(x(i),y(i))-former_base;d = Z(x(i),y(i))-later_base;prominence = min([a b c d]);%峰突强度if prominence < threshold % 未达到阈值的极大值不视为波峰peaks(x(i),y(i)) = 0;end
end

MATLAB寻找三维曲面的有效波峰(滤除噪声产生的极大值)相关推荐

  1. 【matlab】三维曲面

    [matlab]三维曲面 三维曲面用到了surf()函数 语法: surf(X,Y,Z): 先来看一个例子: >> [X Y]=meshgrid(-2:0.5:2); >> Z ...

  2. 【matlab】三维曲面(矩形网格---meshgrid)

    [matlab]三维曲面(矩形网格-meshgrid) 二维曲线: 先找到x,找到对应的y,绘制点. >> x=1:2*pi; >> y=sin(x); >> pl ...

  3. Matlab绘制三维曲面(以二维高斯函数为例)

    原文地址为: Matlab绘制三维曲面(以二维高斯函数为例) 寒假学习了一下Python下的NumPy和pymatlab,感觉不是很容易上手.来学校之后,决定继续看完数字图像处理一书.还是想按照上学期 ...

  4. MATLAB绘图—三维曲面绘图(surf)

    MATLAB绘图-三维曲面绘图(surf) 原创不易,路过的各位大佬请点个赞 <MATLAB绘图-三维绘图-I>博客主要讲了三维曲线图的绘制,本博客主要讲 三维曲线绘图 三维曲面图 曲面图 ...

  5. MATLAB绘制三维曲面图和等高线 绘图(2)

    绘制三维曲面图步骤: 1): 对数据进行处理,得到三维曲面上的点坐标组 方法有: 1.将自变量离散, x=xmin:dx:xmax y=ymin:dy:ymax 2.利用meshgrid 指令 生成 ...

  6. matlab画三维曲面有范围,matlab画三维曲面

    (x,y); z=pi/2*exp(-x.^2/2-y.^2/2); mesh(x,y,z) [在 dreamway (希冀前程) 的大作中提到: ] : 现在,想用 matlab 绘制三维正态曲面, ...

  7. MATLAB简单三维曲面的绘制

    MATLAB数据处理 MATLAB数据处理方面有 1.插值方法介绍,以及获取插值后所得二维.三维图像的信息,并存入EXCEL中. 2.迭代方法,单元迭代以及二元迭代 3.matlab与c#混合编程相关 ...

  8. 【MATLAB教程案例44】通过matlab学习三维曲面的建模,颜色,透明度,动态变化等——以海浪曲面函数为例

    欢迎订阅<FPGA学习入门100例教程>.<MATLAB学习入门100例教程> 目录 1.软件版本 2.三维海浪曲面理论概述 3.通过MATLAB实现三维海浪曲面

  9. matlab画三维向量的曲面,Matlab绘制三维曲面(以二维高斯函数为例)

    寒假学习了一下Python下的NumPy和pymatlab,感觉不是很容易上手.来学校之后,决定继续看完数字图像处理一书.还是想按照上学期的模式,边看边实现书中的算法.上学期看的时候,是用C语言实现的 ...

最新文章

  1. MyEclipse中运行环境jre、编译级别、tomcat运行环境区别
  2. 3-unit10 iptables
  3. 支持多种小程序!阿里云ARMS推出小程序监控
  4. Bash脚本教程之read命令
  5. 原来做的一个语义搜索软件的界面
  6. 图解 CSS (1): 先做一个样式表测试工具
  7. Html5 学习笔记 --》html基础 css 基础
  8. C/C++:Windows获取电脑机器指纹
  9. 2017.9.19 L语言 失败总结
  10. python语言合法命名的_python语言合法命名_python合法命名
  11. 华为成了!鸿蒙OS 2.0对比iOS 14:苹果流畅度竟完败?
  12. 【Git】GitHub for Windows使用(1)
  13. mysql 基于 ssl 的主从复制
  14. java 日期相差年份_JAVA计算两个日期相差的实例
  15. 【优化分类】基于matlab麻雀算法优化核极限学习机KELM分类【含Matlab源码 1791期】
  16. zoho邮箱收费和免费区别_集成MS Office和您的Zoho在线帐户
  17. jmeter性能测试常用插件简介
  18. Chef入门详解 Chef安装 Chef使用
  19. eclipes的使用
  20. php详情页图片尺寸,拼多多主图轮播图详情页图片尺寸要求大全

热门文章

  1. 本地主机可以ping通虚拟机,虚拟机ping不通本地主机,原因(检查是否启用防火墙规则)?
  2. ORACLE数据库 AWR报告收集
  3. JavaScript常用工具方法封装
  4. 思科防火墙——实验练习加命令
  5. C语言快速排序(郝斌老师笔记)
  6. [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2018-16509
  7. PLSQL的存储过程和函数
  8. hbase数据库连接池 未设置最大链接数导致数据库操作异常频发
  9. RouterOS(ROS)软路由安全性配置指南
  10. 基于QtAv及ffmpeg开发的视频播放器