Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python cv.COLOR\U BGR2LAB给出的范围错误_Python_Opencv_Colors_Spyder_Cielab - Fatal编程技术网

Python cv.COLOR\U BGR2LAB给出的范围错误

Python cv.COLOR\U BGR2LAB给出的范围错误,python,opencv,colors,spyder,cielab,Python,Opencv,Colors,Spyder,Cielab,在下面的代码中,我使用了一个png图像4096*4096像素,其中包括所有可能的RGB颜色(不是相同像素的两倍,可以在这里找到) 然后我将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[..

在下面的代码中,我使用了一个png图像4096*4096像素,其中包括所有可能的RGB颜色(不是相同像素的两倍,可以在这里找到) 然后我将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[0255],G[0255],B[0255]给出L[0255],A[42226],B[20223]

如果原始图像具有float32类型,R[0,1],G[0,1],B[0,1]给出L[0100],A[-86.1813,98.2351],B[-107.862,94.4758]

在任何情况下,实验室范围都不是预期的范围,这是由open CV文档给出的


知道如何解释吗?

从OpenCV返回的实验室值永远不会超出范围0≤ L≤ 100, -127 ≤ A.≤ 127, -127 ≤ B≤ 127转换浮点图像时()。转换8位图像时,L的范围乘以255/100,a和b的偏移量为128以填充8位范围

但无论图像数据类型如何:实验室颜色空间的色域都超过了RGB颜色空间的色域,例如,请参见wikipedia文章的第二段


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

我错过了这里的要点。那么,将BGR转换为CieLAB颜色空间的最佳方法是什么?正如问题中所述,OpenCV返回的值超出了
a
b
值的范围,而这些值必须是-127到+127。@decadenza OpenCV文档为浮点和8位图像转换指定了不同的范围,我在对答案的编辑中试图澄清这一点。谢谢。我已经测试了一些代码,要从经典的BGR OpenCV图像中获得正确的值,最简单的方法是执行
img.astype(“float32”)/255
,然后调用
imgLab=cv2.cvtColor(img,cv2.COLOR\u BGR2Lab)
。这是因为,正如OpenCV文档中所指出的,如果输入图像是浮动的,则不会更改Lab值!