如何获取HSV和LAB色彩空间?

3

我正在使用Python的OpenCV。我的代码如下:

img_hsv = cv2.cvtColor(image,cv.CV_BGR2HSV)
img_lab = cv2.cvtColor(image,cv.CV_BGR2Lab)

当我访问像素值时,我得到的是RGB色彩空间中的数值,例如:

img_hsv[x][y] = [255,255,255]

我如何规范化HSV和LAB色彩空间? HSV = 360º 100% 100% 和 LAB = 128 100 100。
编辑1. 回答Rick M.: 您的解决方案是不正确的,因为当我按照您说的将OpenCV的值转换为HSV时,我得到了随机颜色。
例如。 使用img_hsv的原始图像检测值: HSV Values by OpenCV 如果我获取这些值并反转顺序,我将获得RGB值: enter image description here
HSV Value = 16, 25, 230 -> Invert -> 230, 25, 16 = RGB Value
HSV Value = 97, 237, 199 -> Invert -> 199, 237, 97 = RGB Value

所以,当我获取img_hsv的值时,如果我倒转顺序,就可以得到RGB值...那么在img_hsv = cv2.cvtColor(image,cv.CV_BGR2HSV)中OpenCV在做什么呢?我认为OpenCV返回的是BGR值...


你尝试过分离通道,例如h,s,v = cv2.split(img_hsv),单独操作它们并将它们合并在一起,img = cv2.merge((h,s,v)),以获得您想要的结果吗? - thewaywewere
你的意思是它不正确吗?如果你使用HSV的标准化值并使用cvtColor将其转换为RGB,那么它肯定会给你不同的颜色。 - Rick M.
如果我执行 img_hsv = cv2.cvtColor(image,cv.CV_BGR2HSV),所有的值都是BGR而不是HSV。有没有办法获取HSV值而不是BGR值? - Jota
img_hsv 中的值范围为 0-255,但它们是 OpenCV 色彩空间中的 HSV 值。您需要使用转换将它们带入通用的 HSV 色彩空间。(0-360、0-100、0-100) - Rick M.
就像我告诉你的那样,如果我这样做,规范化img_hsv值,我会得到随机颜色,因为它们是BGR而不是HSV。我执行img_hsv = cv2.cvtColor(image,cv.CV_BGR2HSV),所有img_hsv中的值都是BGR,就像帖子编辑一样。你可以看到图片。img_hsv[50,50]返回BGR值,我可以用任何RGB工具打印它,与HSV图像相同的颜色。如果我想要从img_save获取HSV值,我必须从BGR(img_hsv)转换为HSV,这样才能正常工作。 - Jota
那么你的意思是,使用 cv.CV_BGR2HSV 实际上并没有进行任何转换? - Rick M.
1个回答

2

OpenCV可以将所有色彩空间的输出范围调整为(0, 255)。注意:这取决于Mat类型,此处假设为8UC3

因此,要将HSV调整到其范围内:

H(HSV original) = H(OpenCV) * 2.0
S(HSV original) = S(OpenCV) * 100/255.0

V(HSV original) = V(OpenCV) * 100/255.0

同样地,对于 Lab 颜色空间:
L(Lab original) = L(OpenCV) * 100/255.0

a(Lab original) = a(OpenCV) - 128

b(Lab original) = b(OpenCV) - 128

参考资料

添加一个检查,真实的颜色转换,Python代码:

image_rgb = np.zeros((300, 300, 3), np.uint8)
image[:] = (255, 255, 255)

img_hsv = cv2.cvtColor(image_rgb, cv2.COLOR_RGB2HSV)
h = img_hsv[100, 100, 0]
s = img_hsv[100, 100, 1]
v = img_hsv[100, 100, 2]
print h , s , v
>>> 0 0 255

1
我认为H是 H(OpenCV) * 360/255.0,你觉得呢? - Jota
我的 H 值出了问题,不过我只是按照参考文献做的。 - Rick M.
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) print(hsv[47,115]) 返回 [ 98 245 202]。访问 http://colorizer.org/ 并将 [ 98 245 202] 反转到 RGB 部分。您将得到与 HSV 图像相同的黄色。因此, print(hsv[47,115]) 返回 BGR 值,而不是 HSV 值。尝试像 HSV 一样打印 [ 98 245 202] 值,您永远无法获得黄色。 - Jota
之前的H*2.0是正确的。您必须明白OpenCV将RGB图像加载为BGR格式。我检查了三遍答案,它是正确的。在RGB空间中的[200, 255, 255],使用RGB2HSV转换后变成[120, 255, 255],然后使用公式得到的结果是240、100、100,这是正确的。为了澄清,在RGB空间中的[200, 255, 255]在BGR空间中是[255, 255, 200]。如果您对后者进行BGR2HSV操作,得到的HSV与前者进行RGB2HSV操作时所得到的HSV相同。 - Rick M.
让我们在聊天中继续这个讨论 - Rick M.
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接