cv.COLOR_BGR2LAB 给出错误的范围

abi*_*bol 4 python opencv colors spyder cielab

在下面的代码中,我使用一个 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])    
Run Code Online (Sandbox Code Playgroud)

结果如下:

如果原始图像的类型为 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]

无论如何,实验室范围从来都不是预期的范围,这是由开放的简历文档给出的

知道如何解释吗?

w-m*_*w-m 5

OpenCV 返回的 LAB 值绝不会超出范围 0 \xe2\x89\xa4 L \xe2\x89\xa4 100, -127 \xe2\x89\xa4 a \xe2\x89\xa4 127, -127 \xe2\ x89\xa4 b \xe2\x89\xa4 127 转换浮点图像时(OpenCV 颜色转换)。转换8位图像时,L的范围乘以255/100,a和b得到128的偏移量来填充8位范围。

\n\n

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

\n\n

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

\n

  • 谢谢。我测试了一些代码,从经典 BGR OpenCV 图像中获取正确值的最直接方法是执行 `img.astype("float32") / 255`,然后调用 `imgLab = cv2.cvtColor(img, cv2. COLOR_BGR2Lab)`。这是因为,正如 OpenCV 文档中所述,如果输入图像是浮点图像,则 Lab 值不会更改! (2认同)