【问题标题】:cv.COLOR_BGR2LAB gives wrong rangecv.COLOR_BGR2LAB 给出错误的范围
【发布时间】:2015-01-15 12:47:15
【问题描述】:

在下面的代码中,我使用了一个 4096*4096 像素的 png 图像,其中包括所有可能的 RGB 颜色(不是相同像素的两倍,可以在这里找到http://allrgb.com/starry-night) 然后我将 RGB 值转换为 LAB 值并检查每个通道的范围

import cv2 as cv
import numpy as np

im=cv.imread('allrgb.png')


im=im.astype(np.uint8)

colors_lab=cv.cvtColor(im,cv.COLOR_BGR2LAB)

m=np.amin(colors_lab[...,...,0])    

结果如下:

如果原始图像的类型为 uint8,则 R[0,255],G[0,255],B[0,255] 给出 L[0,255],A[42,226],B[20,223]

如果原始图像的类型为 float32,则 R[0,1],G[0,1],B[0,1] 给出 L[0,100],A[-86.1813,98.2351],B[-107.862, 94.4758]

在任何情况下,Lab 范围都不是预期的范围,这是由开放的 CV 文档给出的

知道怎么解释吗?

【问题讨论】:

    标签: python opencv colors spyder cielab


    【解决方案1】:

    在转换浮动图像时,从 OpenCV 返回的 LAB 值永远不会超出 0 ≤ L ≤ 100、-127 ≤ a ≤ 127、-127 ≤ b ≤ 127 的范围 (OpenCV color conversions)。转换8位图像时,L的范围乘以255/100,a和b得到128的偏移量,填满8位范围。

    但无论图像数据类型如何:LAB 色彩空间的色域超过 RGB 色彩空间之一,例如参见LAB 上的维基百科文章中的第二段。

    因此,当您从 RGB/BGR 转换为 LAB 时,您将永远无法获得完整的 LAB 范围,因为 LAB 包含无法用 RGB 表示的颜色。

    【讨论】:

    • 我错过了这里的重点。那么将 BGR 转换为 CieLAB 颜色空间的最佳方法是什么?如问题所述,OpenCV 返回的值超出了ab 值的范围,而这些值必须是-127 到+127。
    • @decadenza OpenCV 文档为浮点和 8 位图像转换指定了不同的范围,我试图在对答案的编辑中澄清这一点。
    • 谢谢。我已经测试了一些代码,从经典 BGR OpenCV 图像中获取正确值的最直接方法是执行img.astype("float32") / 255,然后调用imgLab = cv2.cvtColor(img, cv2.COLOR_BGR2Lab)。这是因为,如 OpenCV 文档中所述,如果输入图像是浮点数,则 Lab 值不会更改!
    猜你喜欢
    • 2013-03-08
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多