You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python检测单侧落差较大的非对称信号峰值?

解决非对称灰度峰值检测问题

问题核心

scipy.signal.find_peaks的默认阈值过滤是对称逻辑(要求峰值左右两侧的落差都达标),但黄圈里的非对称峰值单侧落差大、另一侧小,因此被误过滤。要匹配蓝色线的峰值连线,得放弃对称判断,改用基于峰值突出度或单侧落差/斜率的判定规则。

可行方案

1. 调整find_peaks的prominence参数(推荐)

不用单纯依赖height阈值,改用prominence(峰值相对于周围谷底的突出程度)——这个参数不要求左右落差对称,只要峰值在局部区域有足够的突出度就会被检测:

import numpy as np
from scipy.signal import find_peaks

# 假设gray_curve是你的灰度曲线数组
peaks, properties = find_peaks(gray_curve, prominence=5)  # prominence值根据实际数据调整

prominence会计算峰值到左右最近谷底的最小落差,只要该值达标就会被识别,完美适配单侧落差大的非对称峰值。

2. 自定义非对称峰值检测逻辑

如果需要更精细的控制,可以手动遍历曲线,设定以下判定规则:

  • 该点是局部最大值(比左右相邻点高)
  • 至少一侧的落差超过设定阈值(左侧落差≥阈值 或 右侧落差≥阈值)

示例代码:

def find_asymmetric_peaks(curve, threshold=3):
    peaks = []
    n = len(curve)
    for i in range(1, n-1):
        # 先判断是否为局部最大值
        if curve[i] > curve[i-1] and curve[i] > curve[i+1]:
            left_drop = curve[i] - curve[i-1]
            right_drop = curve[i] - curve[i+1]
            # 单侧落差达标即可
            if left_drop >= threshold or right_drop >= threshold:
                peaks.append(i)
    return np.array(peaks)

# 使用示例
peaks = find_asymmetric_peaks(gray_curve, threshold=5)

这种方法完全自定义判定规则,能精准匹配你需要的非对称峰值。

3. 基于一阶导数的检测

通过计算曲线的一阶导数,找到导数由正变负的点(即峰值),同时检查单侧的变化幅度:

  • 峰值左侧导数为正(曲线上升),右侧导数为负(曲线下降)
  • 左侧上升幅度或右侧下降幅度超过阈值

示例代码:

def find_peaks_derivative(curve, threshold=2):
    deriv = np.diff(curve)
    peaks = []
    for i in range(1, len(deriv)):
        # 导数从正变负,说明是峰值点
        if deriv[i-1] > 0 and deriv[i] < 0:
            peak_idx = i
            rise = deriv[i-1]  # 左侧上升幅度
            drop = -deriv[i]   # 右侧下降幅度
            if rise >= threshold or drop >= threshold:
                peaks.append(peak_idx)
    return np.array(peaks)

# 使用示例
peaks = find_peaks_derivative(gray_curve, threshold=3)

注意事项

  • 所有阈值参数(prominence、threshold)需要根据灰度曲线的实际分布调整,建议先可视化曲线和检测结果来微调。
  • 如果曲线存在噪声,建议先做平滑处理(比如scipy.signal.savgol_filter),避免误检测噪声尖峰。

内容的提问来源于stack exchange,提问作者David H. J.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 14:15:38