如何在python(numpy/scipy)中找到嘈杂数据集中峰值的半高宽?
我正在分析两条交叉线(如+符号)的图像,并提取垂直于其中一条线的一行像素(一个如何在python(numpy/scipy)中找到嘈杂数据集中峰值的半高宽?,python,image-processing,filter,Python,Image Processing,Filter,我正在分析两条交叉线(如+符号)的图像,并提取垂直于其中一条线的一行像素(一个nx1numpy数组)。这给了我一个浮点值数组(表示颜色),然后我可以打印它。我用MaMattLIB绘制数据,我在180到200之间得到一组有噪声的数据,中间有一个明显的峰值,峰值下降到大约100。 我需要找到这个数据的半高宽。我想我需要先过滤噪声,所以我使用了高斯滤波器,它平滑了我的数据,但它的顶部仍然不是超平坦的 我想知道是否有更好的方法来过滤数据 我怎样才能找到这些数据的半高宽 如果可能的话,我只想使用numpy
nx1
numpy数组)。这给了我一个浮点值数组(表示颜色),然后我可以打印它。我用MaMattLIB绘制数据,我在180到200之间得到一组有噪声的数据,中间有一个明显的峰值,峰值下降到大约100。
我需要找到这个数据的半高宽。我想我需要先过滤噪声,所以我使用了高斯滤波器,它平滑了我的数据,但它的顶部仍然不是超平坦的
我最终没有使用任何过滤器,而是使用了原始数据。 我采用的程序是:
- 找到最小点和最大点并计算
difference=max(arr\u y)-min(arr\u y)
- 找到最大值的一半(在我的例子中是最小值的一半)
HM=difference/2
- 找到距离HM最近的数据点:
nearest=(np.abs(arr_y-HM)).argmin()
- 计算了最近距离和最小距离之间的距离(这给了我HWHM)
- 然后简单地乘以2得到半高宽
我不知道(或认为)这是最好的方法,但它很有效,而且根据比较似乎相当准确。您的脚本已经进行了正确的计算 但是,如果将
最近的
和位置极值
之间的距离取为其两侧极值(最大值/最小值)的一半位置,则可以减少最近的
和位置极值
之间的距离误差
import numpy as np
# Example data
arr_x = np.linspace(norm.ppf(0.00001), norm.ppf(0.99999), 10000)
arr_y = norm.pdf(arr_x)
# Effective code
difference = max(arr_y) - min(arr_y)
HM = difference / 2
pos_extremum = arr_y.argmax() # or in your case: arr_y.argmin()
nearest_above = (np.abs(arr_y[pos_extremum:-1] - HM)).argmin()
nearest_below = (np.abs(arr_y[0:pos_extremum] - HM)).argmin()
FWHM = (np.mean(arr_x[nearest_above + pos_extremum]) -
np.mean(arr_x[nearest_below]))
对于本例,您应获得半高宽和标准偏差之间的关系:
FWHM=2.355
乘以上面提到的标准偏差(这里是1)。很抱歉没有图片…我的声誉超过10之前无法添加图片(今天刚刚注册)。欢迎使用Stack Overflow!看起来你想让我们为你写些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在海报已经试图自己解决问题时才提供帮助。演示这项工作的一个好方法是,包括您迄今为止编写的代码、示例输入(如果有)、预期输出和实际获得的输出(控制台输出、堆栈跟踪、编译器错误——任何适用的)。你提供的细节越多,你可能得到的答案就越多。检查和半高宽的答案应指向正确的方向。