【问题标题】:Finding a better threshold in a more accurate manner in OpenCV在 OpenCV 中以更准确的方式找到更好的阈值
【发布时间】:2021-06-03 01:46:00
【问题描述】:

我有一张灰度图像,

背景中的主要颜色是白色和浅灰色, 我曾尝试使用 otsu 二值化,但效果不佳, 所以我决定根据下面的直方图手动写:

img_gray[img_gray > 130] = 255

因此所有白色/灰色阴影都已转换为白色。效果非常好, 我想知道是否有一种有效的方法来获得这个阈值 无需重新发明轮子,我知道我可以申请: np.bincount(img_gray.ravel()) 并尝试在峰值之前找到斜坡的起点。

openCV 中是否有提供类似功能的函数?

谢谢大家!

【问题讨论】:

    标签: opencv opencv-python image-thresholding


    【解决方案1】:

    尝试使用均值和标准差。但这只有在你有一个峰值时才有效

    mean,std = cv2.meanStdDev(img_gray) 
    low_thresh = mean - (std*2)
    

    如果您想要更严格的阈值,请使用 std*1

    【讨论】:

    • 感谢您的回复,我提前知道图像的性质我总会有两个峰,一个小,一个大。还有其他方法吗?
    • 你可能可以过滤掉小峰值然后运行 ​​mean & std,但现在想想,mean & std 可能不会给你峰值开始的确切位置,而是给你 68第 1 次、第 2 次和第 3 次分别为 –95–99.7%。我想你会在信号处理堆栈溢出dsp.stackexchange.com 得到更好的回应
    【解决方案2】:

    如果您知道您的图像总是有两个峰值,也许您可​​以在计算阈值之前使用分位数过滤掉较低的峰值:

    filtered_image = np.where(img_gray > np.quantile(img_gray, 0.2), img_gray, 0)
    threshold, thresh_image = cv2.threshold(filtered_image, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    

    首先,使用适用于您的图像的分位数阈值过滤图像的下端。我在这个例子中使用了 0.2。微调删除第一个峰值的值。 然后,在过滤后的图像中使用 OTSU 阈值选项,使阈值接近您要查找的值。

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多