Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python(numpy/scipy)中找到嘈杂数据集中峰值的半高宽?_Python_Image Processing_Filter - Fatal编程技术网

如何在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。 我需要找到这个数据的半高宽。我想我需要先过滤噪声,所以我使用了高斯滤波器,它平滑了我的数据,但它的顶部仍然不是超平坦的

  • 我想知道是否有更好的方法来过滤数据

  • 我怎样才能找到这些数据的半高宽

  • 如果可能的话,我只想使用numpy、scipy和matplotlib

    以下是原始数据:

    以下是过滤后的数据:

    我最终没有使用任何过滤器,而是使用了原始数据。 我采用的程序是:

    • 找到最小点和最大点并计算
      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!看起来你想让我们为你写些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在海报已经试图自己解决问题时才提供帮助。演示这项工作的一个好方法是,包括您迄今为止编写的代码、示例输入(如果有)、预期输出和实际获得的输出(控制台输出、堆栈跟踪、编译器错误——任何适用的)。你提供的细节越多,你可能得到的答案就越多。检查和半高宽的答案应指向正确的方向。