【发布时间】:2018-03-02 12:31:45
【问题描述】:
我正在使用 Python 脚本,该脚本在特定值范围内沿一维轮廓查找峰(或在我的情况下为谷)的索引。我的目标是测量每个感兴趣谷的 FWHM。 This is an example of 1D profile
这是脚本:
def detect_peaks (x, mnph=None, mxph=None, mpd=1, threshold=0, edge='rising',
kpsh=False, valley=False, show=False, ax=None):
#from __future__ import division, print_function
import numpy as np
x = np.atleast_1d(x).astype('float64')
if x.size < 3:
return np.array([], dtype=int)
if valley:
x = -x
# find indices of all peaks
dx = x[1:] - x[:-1]
# handle NaN's
indnan = np.where(np.isnan(x))[0]
if indnan.size:
x[indnan] = np.inf
dx[np.where(np.isnan(dx))[0]] = np.inf
ine, ire, ife = np.array([[], [], []], dtype=int)
if not edge:
ine = np.where((np.hstack((dx, 0)) < 0) & (np.hstack((0, dx)) > 0))[0]
else:
if edge.lower() in ['rising', 'both']:
ire = np.where((np.hstack((dx, 0)) <= 0) & (np.hstack((0, dx)) > 0))[0]
if edge.lower() in ['falling', 'both']:
ife = np.where((np.hstack((dx, 0)) < 0) & (np.hstack((0, dx)) >= 0))[0]
ind = np.unique(np.hstack((ine, ire, ife)))
# handle NaN's
if ind.size and indnan.size:
# NaN's and values close to NaN's cannot be peaks
ind = ind[np.in1d(ind, np.unique(np.hstack((indnan, indnan-1, indnan+1))), invert=True)]
# first and last values of x cannot be peaks
if ind.size and ind[0] == 0:
ind = ind[1:]
if ind.size and ind[-1] == x.size-1:
ind = ind[:-1]
"""ABOUT mnph and mxph => It works just on valleys, for peaks: REMOVE the minus ("-") below in the code"""
# remove valleys < minimum peak height
if ind.size and mnph is not None:
ind = ind[-x[ind] >= mnph]
# remove valleys > maximum peak height
if ind.size and mxph is not None:
ind = ind[-x[ind] <= mxph]
return ind
如何执行此操作?
【问题讨论】:
-
如果你想找到每个山谷的 FWHM,我的想法是你需要一个单独的高斯拟合每个山谷。从您的图像图的外观来看,这有点难以自动化,但如果您可以将大量高斯分布与手动选择的谷槽固定值混合,那么这可能是解决问题的第一步。跨度>
标签: python image image-processing curve-fitting curve