【问题标题】:how to threshold LAB image如何阈值 LAB 图像
【发布时间】:2014-04-12 08:22:04
【问题描述】:

我正在用 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 图像进行阈值处理吗?

【问题讨论】:

  • 我严重怀疑 otsu 是否适用于 Lab 色彩空间。另一个问题是,虽然我对 Python 的理解相当基本,但你是在尝试对灰度图像或实验室图像进行阈值处理吗?这是因为在您转换和创建图像实验室之后,您从未使用过它,并且当您对其进行模糊处理时,不知从何而来的图像是灰色的。

标签: python opencv image-processing lab-color-space


【解决方案1】:

Opencv 阈值文档:

输入数组(单通道、8 位或 32 位浮点)。

您不能对彩色图像设置阈值。 grey 是从哪里来的?您永远不会使用实验室转换后的图像。

【讨论】:

    【解决方案2】:

    如果图像强度小于某个固定常数 T,则最简单的阈值化方法将图像中的每个像素替换为黑色像素,如果图像强度大于该常数,则将其替换为白色像素。因此,为了进行阈值处理,建议使用灰度图像。

    在 opencv 中,cv2.threshold 有两个参数,第一个参数是 源图像,应该是灰度图像。第二个参数是用于分类的阈值 像素值。

    但是在Wikipedia 中,有一个参考资料表明,我们可以通过为图像的每个 RGB 分量指定一个单独的阈值来对彩色图像进行阈值处理,然后将它们与 AND 操作结合起来。

    【讨论】:

      【解决方案3】:

      输入图像应该是像 M4rtini 所说的单通道 8 位或 32 位浮点数。但是,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。

      【讨论】:

        猜你喜欢
        • 2012-02-19
        • 1970-01-01
        • 2017-08-30
        • 2020-01-25
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        • 2021-10-02
        • 2016-11-17
        相关资源
        最近更新 更多