colorsys中的RGB到HSV转换有误?

4

我正在使用Python的colorsys库:

import colorsys
colorsys.rgb_to_hsv(64, 208, 61)

output:(0.16666666666666666, 0, 208)

但是这个输出是错误的,这是使用 RGB 到 HSV 在线转换器得出的真实值:RGB to HSV

发生了什么?

2个回答

12

colorsys 的取值范围为 01

  

所有这些颜色空间中的坐标都是浮点数值。在 YIQ 空间中,Y 坐标的取值范围为 0 到 1,但 I 和 Q 坐标可以是正数或负数。在所有其他空间中,坐标都在 0 到 1 之间。

你需要将每个值除以 255. 才能得到期望的输出:

>>> colorsys.rgb_to_hsv(64/255., 208/255., 61/255.)
(0.3299319727891157, 0.7067307692307692, 0.8156862745098039)

第一个值呢?在线转换器上显示为120度。 - Jota
3
0.3299319727891157 乘以 360 的结果为 118.77551020408164,这个数接近于 120 - Dan D.
@DanD。在与OpenCV进行比较后,我认为应该将h乘以180,将sv乘以255: green = np.uint8([[[0,255,0 ]]]); hsv = cv2.cvtColor(green, cv2.COLOR_RGB2HSV); array([[[ 60, 255, 255]]], dtype=uint8); 然后:hsv2 = colorsys.rgb_to_hsv(0, 1, 0); (180*hsv2[0], 255*hsv2[1], 255*hsv2[2]) ; (60.0, 255.0, 255) - Mohd
针对上面给出的具体例子: colorsys.rgb_to_hsv(64/255., 208/255., 61/255.); (0.3299319727891157, 0.7067307692307692, 0.8156862745098039); x = colorsys.rgb_to_hsv(64/255., 208/255., 61/255.); print(x[0]*180); Out[194]: 59.38775510204082 ; 然后,使用openCV: col = np.uint8([[[64, 208, 61 ]]]); hsv = cv2.cvtColor(col, cv2.COLOR_RGB2HSV); print(hsv) Out[197]: array([[[ 59, 180, 208]]], dtype=uint8) - Mohd

0
为了避免这样的错误,您可以使用colorir。它在底层使用colorsys,但允许格式规范:
>>> from colorir import sRGB
>>> sRGB(64, 208, 61).hsv(round_to=1)
HSV(118.8, 0.7, 0.8)

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