scipy signal find_peaks_cwt没有准确找到峰值?

cjm*_*671 19 python signal-processing scipy image-segmentation

我有一个1-D信号,我正试图找到峰值.我想找到他们完美.

我现在正在做:

import scipy.signal as signal
peaks = signal.find_peaks_cwt(data, np.arange(100,200))
Run Code Online (Sandbox Code Playgroud)

以下是带有红点的图表,其中显示了峰的位置find_peaks_cwt().

信号+峰值

如您所见,计算出的峰值不够准确.非常重要的是右侧的三个.

我的问题:我如何使这更准确?

更新:数据在这里:http://pastebin.com/KSBTRUmW

对于某些背景,我正在尝试做的是在图像中找到手指之间的空间.绘制的是手周围轮廓的x坐标.青色斑点=峰.如果有更可靠/更健全的方法,请发表评论.

在此输入图像描述

cjm*_*671 17

解决了,解决方案:

首先过滤数据:

  window = signal.general_gaussian(51, p=0.5, sig=20)
  filtered = signal.fftconvolve(window, data)
  filtered = (np.average(data) / np.average(filtered)) * filtered
  filtered = np.roll(filtered, -25)
Run Code Online (Sandbox Code Playgroud)

然后按照rapelpy的回答使用angrelextrema.

结果:

在此输入图像描述

  • 你能添加寻找峰值的代码吗?我认为rapelpy的答案已被编辑 (2认同)
  • cjm2671,请详细解释你的答案,包括与拉普拉斯核的卷积、缩放和滚动。 (2认同)

swe*_*eam 16

使用此功能有一个更简单的解决方案:https: //gist.github.com/endolith/250860 ,它是http://billauer.co.il/peakdet.html的改编版.

我刚试过你提供的数据,我得到了下面的结果.无需预过滤......

请享用 :-)

峰值检测


rap*_*lpy 5

获取原始数据后进行编辑。

argelmax 和 arglextrma 退出了比赛。

该曲线噪声很大,因此您必须使用较小的峰宽(如 pv. 提到的)和噪声。

我发现的最好的看起来不太好。

import numpy as np
import scipy.signal as signal

peakidx = signal.find_peaks_cwt(y_array, np.arange(10,15), noise_perc=0.1)
print peakidx

[10, 100, 132, 187, 287, 351, 523, 597, 800, 1157, 1451, 1673, 1742, 1836]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述