如何从 RGB 中获取真实颜色
How to get true color from RGB
我有一台输出为 RGB 的相机。
将 RGB 值转换为 "Green" (例如)或任何其他颜色的首选方法是什么?
当然不是在谈论 0,255,0 而是更微妙的值
这是一个你可以考虑的一维算法。首先决定您希望在域中拥有多少个颜色名称。例如,如果我们只看红色,则可能有四种颜色:
[bright red, red, burgundy, black]
这些颜色将出现在以下红色值处:
[255, 170, 85, 0]
现在,当您的程序遇到一个具有随机红色值的点时,您可以选择最接近它的颜色名称。例如,红色值 200 最接近 170,即红色,因此您会将颜色报告为红色。
这种方法可以通过一些工作扩展到 RGB 的三个维度。
如果你想根据人类如何分类颜色来分配颜色,那么你需要离开 RGB space 并移动到例如 HSL 或 HSV.
When in those spaces H(色调)是人类通常对 "color"(如 "green")的意思。
获得 H 的一个简单方法是从所有三个中减去 R、G 和 B 中的最小值,并将剩余的最大值缩放为 1。然后你有 6 种情况(颜色的 6 "slices"轮)取决于哪个组件达到 0,哪个达到 1,哪个是中间组件。在Python
def H(r, g, b):
# Remove min (this maximizes saturation)
minv = min(r, g, b)
r -= minv
g -= minv
b -= minv
# Scale max to 1 (this normalizes brightness)
maxv = max(r, g, b)
if maxv == 0:
return None # H for pure black is undefined
k = 60.0 / maxv
r = int(r * k + 0.5)
g = int(g * k + 0.5)
b = int(b * k + 0.5)
# Compute result
if r == 60:
return (g - b) % 360
elif g == 60:
return 120 + b - r
else:
return 240 + r - g
您需要使用某种列表将 RGB 值映射到颜色名称。
我建议你在你的软件中加入类似的东西:
https://en.wikipedia.org/wiki/List_of_colors:_A%E2%80%93F
然后使用您必须从中获得最佳匹配的 RGB 值。
请注意照明和白平衡的重要性。准确的颜色识别是很难做到的。
我有一台输出为 RGB 的相机。 将 RGB 值转换为 "Green" (例如)或任何其他颜色的首选方法是什么? 当然不是在谈论 0,255,0 而是更微妙的值
这是一个你可以考虑的一维算法。首先决定您希望在域中拥有多少个颜色名称。例如,如果我们只看红色,则可能有四种颜色:
[bright red, red, burgundy, black]
这些颜色将出现在以下红色值处:
[255, 170, 85, 0]
现在,当您的程序遇到一个具有随机红色值的点时,您可以选择最接近它的颜色名称。例如,红色值 200 最接近 170,即红色,因此您会将颜色报告为红色。
这种方法可以通过一些工作扩展到 RGB 的三个维度。
如果你想根据人类如何分类颜色来分配颜色,那么你需要离开 RGB space 并移动到例如 HSL 或 HSV.
When in those spaces H(色调)是人类通常对 "color"(如 "green")的意思。
获得 H 的一个简单方法是从所有三个中减去 R、G 和 B 中的最小值,并将剩余的最大值缩放为 1。然后你有 6 种情况(颜色的 6 "slices"轮)取决于哪个组件达到 0,哪个达到 1,哪个是中间组件。在Python
def H(r, g, b):
# Remove min (this maximizes saturation)
minv = min(r, g, b)
r -= minv
g -= minv
b -= minv
# Scale max to 1 (this normalizes brightness)
maxv = max(r, g, b)
if maxv == 0:
return None # H for pure black is undefined
k = 60.0 / maxv
r = int(r * k + 0.5)
g = int(g * k + 0.5)
b = int(b * k + 0.5)
# Compute result
if r == 60:
return (g - b) % 360
elif g == 60:
return 120 + b - r
else:
return 240 + r - g
您需要使用某种列表将 RGB 值映射到颜色名称。
我建议你在你的软件中加入类似的东西: https://en.wikipedia.org/wiki/List_of_colors:_A%E2%80%93F
然后使用您必须从中获得最佳匹配的 RGB 值。
请注意照明和白平衡的重要性。准确的颜色识别是很难做到的。