scipy.signal.find_peaks prominence参数未检测全部符合条件峰值的问题排查
问题分析与解决
首先你对prominence(突出度)的理解确实有偏差:它的计算不是以信号左边界的最低值为基准,而是峰值到其左右两侧“最低鞍点”的垂直距离的最小值。所谓鞍点,是指从峰值向左/右移动时,第一个比当前峰值低的“局部最低点”;如果一直到信号端点都没有更低的点,就用端点值作为基准。
你的代码细节
你传入的是-blur[200,:],相当于把原灰度信号反转了——原信号的低谷变成了反转后的峰值,所以你设置的prominence=20,实际是要求反转后的峰值(原信号的谷)的突出度≥20,也就是原信号中该位置的灰度值要比左右鞍点低至少20。
为什么目标峰值没被检测到?
你圈出的那个峰值,实际计算出的突出度大概率没达到20。可以用以下代码验证每个候选峰值的真实突出度:
import scipy.signal as signal # 先获取所有潜在峰值(不限制prominence) all_peaks, _ = signal.find_peaks(-blur[200,:]) # 计算每个峰值的突出度 prominences = signal.peak_prominences(-blur[200,:], all_peaks)[0] # 输出每个峰值的位置和对应突出度 for peak_pos, prom in zip(all_peaks, prominences): print(f"位置 {peak_pos} 的峰值,突出度为 {round(prom, 2)}")
运行后找到你圈出的峰值对应的位置,就能看到它的实际突出度是否满足≥20的要求。
补充说明
如果确实需要以左边界为基准计算“突出度”,可以手动计算每个峰值与左边界最低值的差值,再筛选符合条件的峰值,而不是依赖find_peaks的prominence参数。
内容的提问来源于stack exchange,提问作者Larsito
相关产品推荐
相关产品推荐

