【问题标题】:how to conditionally apply threshold in opencv如何在opencv中有条件地应用阈值
【发布时间】:2020-01-11 12:46:12
【问题描述】:

我有 2 种类型的图像要处理。一种具有白色背景,另一种具有深色背景。我的要求是为每种类型应用不同的阈值

例如:白色背景

(thresh, img_bin) = cv2.threshold(img, 128 , 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

用于深色背景

(thresh, img_bin) = cv2.threshold(img, 128 , 255, cv2.THRESH_BINARY_INV  + cv2.THRESH_OTSU)

我正在使用cv.imread(img,0)阅读图像

我正在做形态变换,所以我需要反转白色背景图像。但是对于深色背景,我不想反转。

【问题讨论】:

  • 要确定背景是大多数白色还是黑色,您可以使用cv2.countNonZero()。一种方法是如果返回值(白色像素)大于整个图像的 50%,则背景为白色,否则背景为黑色。根据结果​​,您可以应用适当的阈值
  • 酷 - 请展示一些图片并说出您的问题或您遇到的问题。
  • 这对我很有效。cv2.countNonZero() 谢谢

标签: opencv image-thresholding


【解决方案1】:

要扩展 @nathancy 的评论,您可以使用 OpenCV 函数之一,summean

对于一个普通的旧 24 位彩色图像,黑白表示为 ( 0, 0, 0) 黑色 (255, 255, 255) 白色

这是一个看起来像书页的示例图片:

现在让我们在上面运行一些代码

import cv2 as cv
import numpy as np

img = cv.imread('lorem_ipsum.png',cv.IMREAD_COLOR)

ret = cv.mean(img)
print(ret)

ret = cv.mean(ret)
print(ret)

ret = ret*4/3
print(ret)

ret = cv.mean(cv.mean(img))[0]*4/3
print(ret)

给出输出:

(229.78, 228.28, 228.95, 0.0)
(171.74, 0.0, 0.0, 0.0)
228.98
228.98

第一行给出了蓝色、绿色、红色和 Alpha 通道的平均值。第二行是均值。因为第一行的条目为零,所以均值太低。我们要忽略 Alpha 通道。所以在最后一行,我们只选择平均值的第一个元素并将其缩放 4/3 以获得 0 到 255 的答案。我们的答案是 228.98 --> 图片大部分是白色的。最后一行是在一行中完成所有操作的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-25
    • 2017-04-12
    • 2017-05-19
    • 2018-07-06
    • 2021-04-29
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多