在直方图中间找到最小值

信息处理 图像分割
2022-02-02 18:26:28

我正在构建一个图像处理管道,该过程中的一个步骤需要根据饱和度对图像进行阈值处理。

使用 OpenCV-Python 的示例代码:

H, S, V = cv2.split(img)
mask = cv2.threshold(S, low, 255, cv2.THRESH_BINARY)

low如果我查看直方图,我知道如何手动设置值:

直方图示例

(红色箭头表示我会选择的值)

我的问题是:如何以编程方式找到该值?

一些不严谨的问题描述:

  • 找到最右边的“驼峰”的下边界
  • 找到不在边缘的最小值
1个回答

对我来说,这看起来像你想要的东西

  • 从右边开始。将 bin 的值相加,只要
    • 添加的 bin 大于最后一个或
    • 该 bin 添加的值除以当前总和仍高于固定阈值

调整阈值以满足您的需求。

通常,平滑直方图(有效地:对其应用低通滤波器)会有所帮助。或者你做一些事情,比如找到一个函数 fit,比如一个固定次数的多项式(比如说 5),它可以最小化一些误差函数(例如,所有 bin 中的平方和绝对误差),然后分析地找到局部极值。