我建议使用HSV颜色空间来比较颜色,因为它对变化的光照不太敏感,而RGB则很敏感。例如阳光下的绿色可能是rgb(20,255,10),而阴影中的绿色可能是rgb(3,45,2),但在HSV颜色空间中,两者的色调非常相似。
那么,开始操作吧...
创建一个小的10x1 numpy数组,并使第一个像素为红色、第二个为橙色、然后是黄色、绿色、蓝色、靛蓝色、紫罗兰色、黑色、灰色和白色。这里有一个表格:
链接。
然后转换到HSV颜色空间并注意色调值。
下面是一些初始代码...
import numpy as np
import imageio
import cv2
im = np.zeros([1,10,3], dtype=np.uint8)
im[0,0,:]=[255,0,0]
im[0,1,:]=[255,165,0]
im[0,2,:]=[255,255,0]
im[0,3,:]=[0,255,0]
im[0,4,:]=[0,0,255]
im[0,5,:]=[75,0,130]
im[0,6,:]=[238,130,238]
im[0,7,:]=[0,0,0]
im[0,8,:]=[127,127,127]
im[0,9,:]=[255,255,255]
imageio.imwrite("result.png",im)
hsv=cv2.cvtColor(im,cv2.COLOR_RGB2HSV)
print(hsv)
请查看图片:
![在此输入图片描述](https://istack.dev59.com/7Yp2N.webp)
使用Imagemagick也可以检查颜色:
convert result.png txt:
0,0: (65535,0,0)
1,0: (65535,42405,0)
2,0: (65535,65535,0)
3,0: (0,65535,0)
4,0: (0,0,65535)
5,0: (19275,0,33410)
6,0: (61166,33410,61166)
7,0: (0,0,0)
8,0: (32639,32639,32639)
9,0: (65535,65535,65535)
现在看一下下面的HSV数组 - 特别是第一列(色相)。您可以看到红色的色相为0,橙色为19,黄色为30等。还要注意黑色、灰色和白色都具有零饱和度,黑色具有较低的亮度,灰色具有中等的亮度,而白色具有较高的亮度。
[[[ 0 255 255]
[ 19 255 255]
[ 30 255 255]
[ 60 255 255]
[120 255 255]
[137 255 130]
[150 116 238]
[ 0 0 0]
[ 0 0 127]
[ 0 0 255]]]
现在你可以在Python中创建一个数据结构,用于存储每种颜色的以下信息:
因此,你可以使用以下代码:
... see note at bottom for Red
14,23,"Orange"
25,35,"Yellow"
55,65,"Green"
115,125,"Blue"
...
等等,从表格中省略黑色、灰色和白色。
那么,你要如何使用它呢?
好的,当你得到一个要检查的颜色时,首先将 R、G 和 B 值转换为HSV,然后查看结果中的饱和度 - 这是颜色鲜艳程度的一种度量。花哨的颜色会有很高的饱和度,而缺乏光泽、带灰色调的颜色会有较低的饱和度。
因此,看看饱和度是否超过了最大可能值的 10%,例如在 0-255 的范围内超过了 25。
如果饱和度低于限制,请检查亮度并根据亮度的高低分配黑色、灰色或白色。
如果饱和度超过了限制,请检查它是否在你记录的色相的下限和上限之间,并相应地命名。
因此,代码大致如下:
def ColorNameFromRGB(R,G,B)
onepx=np.reshape(np.array([R,G,B],dtype=np.uint8),(1,1,3))
onepxHSV=cv2.cvtColor(onepx,cv2.COLOR_RGB2HSV)
...
...
if S<25:
if V<85:
return "black"
elsif V<170:
return "grey"
return "white"
Iterate through colour names table and return name of entry with matching Hue
需要注意的有两点:
由于HSV(Hue, Saturation, Value)颜色轮是一个圆形,而红色的Hue值位于0度,因此Red颜色的Hue值存在不连续性。在OpenCV中,将0-360范围缩小一半(即除以2),因此范围为0-180,能够很好地适配单个无符号字节。因此,对于红色,应检查Hue大于175且小于5。
在查找颜色时,请确保始终生成8位图像,因为16位和浮点图像的Hue值比例不同。