我在python中做一个用于手势识别的项目。因此,LAB颜色空间的使用将有助于提高识别的准确性,因为我们知道我们的肤色主要包括红色和黄色的比例,并且在Lαβ颜色空间的情况下,α分量表示红色之间的像素分量位置绿色,而β成分代表黄色和蓝色之间,使其不易受噪音影响。 但问题是,当我尝试使用opencv中提供的阈值函数将Lab图像转换为二进制时,它返回了一些错误,因为阈值函数的输入应该是灰度图像。有谁知道如何解决这个问题?
lab = cv2.cvtColor(img,cv2.COLOR_BGR2LAB)
blur = cv2.GaussianBlur(gray,(5,5),0)
ret,thresh1 = cv2.threshold(blur,70,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
返回的错误是断言失败。
有谁知道如何阈值LAB图像?
答案 0 :(得分:3)
如果图像强度小于某个固定常数T,则最简单的阈值处理方法用黑色像素替换图像中的每个像素,如果图像强度大于该常数,则用白色像素替换。因此,为了进行阈值处理,建议使用灰度图像。
在opencv中,cv2.threshold
有两个参数,第一个参数是
源图像,应该是灰度图像。第二个参数是用于分类的阈值
像素值。
但是在Wikipedia中,有一个参考,我们可以通过为图像的每个RGB分量指定一个单独的阈值来阈值彩色图像,然后将它们与AND操作组合。
答案 1 :(得分:2)
Opencv threshold文档:
输入数组(单通道,8位或32位浮点)。
您无法对彩色图像进行阈值处理。 grey
来自哪里?您永远不会使用实验室转换的图像。
答案 2 :(得分:1)
输入图像应该是单通道8位或32位浮点数,如M4rtini所说。但是,RGB,Lab,HSV都是从3个8位通道构建的图像。如果您拆分频道
L, a, b = cv2.split(lab)
结果将是3个单通道图像。这些你可以输入到函数
ret,thresh_L = cv2.threshold(L,70,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
ret,thresh_a = cv2.threshold(a,70,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
ret,thresh_b = cv2.threshold(b,70,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
基本上,你可以输入任何2d numpy数组到阈值函数,只要它的8位或32位浮点数。 OpenCv将Lab色彩空间缩放到0-256。