我正在尝试细分足球场。我正在关注一份研究报告

  • 转换为HSV
  • 捕获色调 channel
  • 生成直方图
  • 抓取全局和局部最大值(全局最大值可以是max(hist))
  • 如果局部最大值是全局最大值的20%,则将其视为

  • python - 直方图的全局和局部极大值-LMLPHP

    问题是我不知道如何获得本地千里马。我正在尝试捕获直方图中的峰列表。

    我已经在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
    
    

    最佳答案

    参见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, 2, -1, -6, -2] // 2-based index
    

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

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

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

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

    关于python - 直方图的全局和局部极大值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57220504/

    10-13 05:10