3

在下面的代码中,我使用了一个 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 文档给出的

知道如何解释吗?

4

1 回答 1

1

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

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

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

于 2014-11-18T15:04:03.137 回答