如何在opencv中有条件地应用阈值

时间:2019-09-09 18:19:48

标签: opencv image-thresholding

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

例如:用于白色背景

(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)

读取图像

我正在进行形态转换,因此我需要反转白色背景图像。但对于深色背景,我不想反转。

1 个答案:

答案 0 :(得分:0)

要扩展@nathancy的注释,可以使用summean的OpenCV函数之一

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

这是一个示例图像,看起来像书中的一页: enter image description here

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

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->图片大部分是白色的。最后一行是一行完成所有操作的结果。