V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LeeReamond
V2EX  ›  问与答

请问有什么适合搜索峰值的算法吗?

  •  
  •   LeeReamond · 2022-07-17 14:37:10 +08:00 · 1703 次点击
    这是一个创建于 854 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有一个图像处理的需求是需要获取单通道峰值点,

    比如上面这张图,如果把整个分布视为一条曲线的话,假设从左到右是 0-255 ,可以看出图中有 2 个(或 3 个)峰,这张图的情况的话理论希望输出 15,240 (大概类似这个数吧,就是各峰的中心点)

    请问有什么算法能实现类似效果么?因为数据本身是离散的,本身又有随机性,如果写一个遍历,比如某个点比左高,同时比右高,就判断为中心点,这种是不行的。因为数据没有周期性,fft 似乎也是分析不出来,小波分析我看了些文章没看懂,而且感觉似乎不太适合这种情况。。

    11 条回复    2022-07-18 14:21:44 +08:00
    Jooooooooo
        1
    Jooooooooo  
       2022-07-17 14:50:21 +08:00
    做一下平滑处理呗

    实际上是你没有想清楚"峰值"定义导致的
    biepin
        2
    biepin  
       2022-07-17 15:16:19 +08:00
    ”如果写一个遍历,比如某个点比左高,同时比右高,就判断为中心点,这种是不行的“
    如果说筛选出来的所有中心点再进行筛选一次呢?保留波动较大的点
    zcf0508
        3
    zcf0508  
       2022-07-17 15:50:06 +08:00 via Android
    从左往右遍历,先升再降的就算是一个峰值
    LeeReamond
        4
    LeeReamond  
    OP
       2022-07-17 15:55:45 +08:00 via Android
    @Jooooooooo 确实,因为概念本身比较模糊。平滑是一个方案,但不能保证平滑就一定没问题了,而且我私下里感觉平滑比较昂贵,我希望性能高一些。


    @biepin 是一个思路,很有启发,但感觉没法直接用。还有一个想法是不取最高值也行,有时候最高的点似乎也不能描述整个峰的情况,也许实际来说用一整个峰的重心位置比较合适。。。
    dayeye2006199
        5
    dayeye2006199  
       2022-07-17 16:02:22 +08:00
    先做个差分,爬坡阶段的“导数”一般都是正的(增长);下坡的“导数”一般都是负的。

    所以差分的图就是 ++++---------+++++--------- 这样的。

    然后套个隐马尔可夫,侦测一下+变-的转折点在什么地方,不知道是否可行?
    LeeReamond
        6
    LeeReamond  
    OP
       2022-07-17 18:07:29 +08:00 via Android
    @dayeye2006199 由于噪声,包括图中还有重峰,实际执行结果应该是+-++---+----+++-大概类似这样
    yesterdaysun
        7
    yesterdaysun  
       2022-07-18 09:44:46 +08:00
    试试 python 的 peakutils
    blueperson
        8
    blueperson  
       2022-07-18 11:53:03 +08:00
    @LeeReamond 那你想要的可能就是峰型拟合了(不考虑代价先). 峰型拟合的前提是, 定义峰型函数, 数据失真度不高. 做个拟合看看是不是顺眼. 不知道你这边的信号是否需要考虑峰的叠加问题, 信号叠加会导致实际呈现的峰型改变.
    lysS
        9
    lysS  
       2022-07-18 12:35:41 +08:00
    峰不就是单增变成了单减嘛
    CFM880
        10
    CFM880  
       2022-07-18 12:50:54 +08:00
    链接: https://pan.baidu.com/s/1eSIZ_d9Tmv5Hha25FsyK_A 提取码: xa8g 复制这段内容后打开百度网盘手机 App ,操作更方便哦
    --来自百度网盘超级会员 v8 的分享

    下载下来,以只读模式打开,之前的核数据处理的课程,有类似的需求
    EzekielDaun
        11
    EzekielDaun  
       2022-07-18 14:21:44 +08:00 via Android
    用过 scipy 的 find_peaks ,具体是什么算法不太清楚
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6170 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 290ms · UTC 02:36 · PVG 10:36 · LAX 18:36 · JFK 21:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.