【问题标题】:Global and Local Maximas of the histogram直方图的全局和局部最大值
【发布时间】:2019-07-27 18:27:43
【问题描述】:

我正在尝试分割足球场。我正在关注一篇研究论文,该论文建议

  1. 转换为 HSV
  2. 抓住 Hue 通道
  3. 生成直方图
  4. 获取全局和局部最大值(全局最大值可以是max(hist)
  5. 如果局部最大值是全局最大值的 20%,请考虑

问题是我不知道如何获得 Local Maximas。我正在尝试捕获直方图中的峰值列表。

我在 MatLab 上试过,效果很好,但我需要在 python 中做。我已经尝试过 peakutils 之类的库,但没有什么能给我想要的结果。

def field_area_mask(image):

    # Convert to HSV
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

    # Capture the Hue Channel
    hue = hsv[:, :, 0]

    # Generate Histogram
    hist = cv2.calcHist([hue],[0],None,[256],[0,256])

    # Capture range
    hist_range = hist[:121] # 0-120
    hist_range = hist_range.reshape(1, -1)[0]
    Hmax = max(hist_range)
    plt.plot(hist_range)

    HiMax = [] # Need to populate the local maxima's list

【问题讨论】:

标签: python opencv


【解决方案1】:

numpy.diff

从一阶导数可以找到固定点。从二阶导数您可以判断这些点是局部最大值还是最小值。

示例:给定您的直方图

[1, 2, 1, 3, 7, 10, 7, 2] // 0-based index

一阶导数是

[1, -1, 2, 4, 3, -3, -5] // 1-based index

符号在第 2、3 和 6 个元素处发生变化。

二阶导数是

[-2, 3, 2, -1, -6, -2] // 2-based index

第二个元素的符号是 (-),局部最大值

第三个元素的符号是 (+),局部最小值

第 6 个元素的符号是 (-),局部最大值

全局最大值为 10,因此您的阈值是 %20 * 10 = 2。第二个元素应被接受为局部最大值。

【讨论】:

【解决方案2】:

我能够使用scipy.signal 的方法argrelextrema 找到峰值。 我将它与np.greater 一起使用。

peaks = argrelextrema(hist_range, np.greater)

【讨论】:

    猜你喜欢
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2021-09-12
    相关资源
    最近更新 更多