如何对LAB图像进行阈值处理
我正在做一个用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图像进行阈值处理?
3 个回答
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)
基本上,只要是8位或32位浮点格式的二维numpy数组,你都可以输入到阈值函数里。OpenCv会把Lab颜色空间的值缩放到0到256之间。
2
Opencv阈值处理文档:
输入数组(单通道,8位或32位浮点数)。
你不能对彩色图像进行阈值处理。那么,grey
是从哪里来的呢?你从来没有使用转换后的图像。
3
最简单的阈值处理方法是这样的:如果图像中的某个像素亮度低于一个固定的值T,就把这个像素变成黑色;如果亮度高于这个值,就把它变成白色。因此,进行阈值处理时,建议使用灰度图像。
在opencv中,cv2.threshold
函数需要两个参数。第一个参数是源图像,这个图像必须是灰度图像。第二个参数是阈值,用来判断像素的亮度。
不过在维基百科上提到,我们也可以对彩色图像进行阈值处理,方法是为图像的每个RGB颜色分量设置一个单独的阈值,然后用“与”操作把它们结合起来。