如何对LAB图像进行阈值处理

2 投票
3 回答
3745 浏览
提问于 2025-04-17 21:29

我正在做一个用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颜色分量设置一个单独的阈值,然后用“与”操作把它们结合起来。

撰写回答