Machine learning 如何从RGB获得真彩色

Machine learning 如何从RGB获得真彩色,machine-learning,computer-vision,Machine Learning,Computer Vision,我有一台输出为RGB的相机。 将RGB值转换为“绿色”(例如)或任何其他颜色的首选方法是什么? 当然不是说0255、0,而是更微妙的值这是一个可以考虑的一维算法。首先,确定您希望在域中拥有多少颜色名称。例如,如果我们只看红色,您可能有四种颜色: [bright red, red, burgundy, black] 这些颜色将出现在以下红色值处: [255, 170, 85, 0] 现在,当程序遇到随机红色值的点时,您可以选择与该点最匹配的颜色名称。例如,红色值200最接近170,即红色,因此

我有一台输出为RGB的相机。 将RGB值转换为“绿色”(例如)或任何其他颜色的首选方法是什么?
当然不是说0255、0,而是更微妙的值

这是一个可以考虑的一维算法。首先,确定您希望在域中拥有多少颜色名称。例如,如果我们只看红色,您可能有四种颜色:

[bright red, red, burgundy, black]
这些颜色将出现在以下红色值处:

[255, 170, 85, 0]
现在,当程序遇到随机红色值的点时,您可以选择与该点最匹配的颜色名称。例如,红色值200最接近170,即红色,因此您可以将颜色报告为红色


这种方法可以通过少量工作扩展到RGB的三维。

如果您想根据人类对颜色的分类来分配颜色,那么您需要离开RGB空间,例如移动到HSLHSV

H(色调)是人类通常对“颜色”(如“绿色”)的意思

得到H的一个简单方法是从这三个值中减去R、G和B的最小值,并将剩余值的最大值缩放为1。然后根据哪个分量为0、哪个分量为1以及哪个分量是中间分量,您有6个案例(色轮的6个“切片”)。用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值映射到颜色名称

我建议您在软件中加入类似的内容:

然后使用RGB值从该表中获得最佳匹配


请注意照明和白平衡的重要性。精确的颜色识别很难实现。

在等间距网格上设置RGB值的3D阵列。每一个传入的RGB三元组都会映射到最近的已知颜色。如果你想帮助实现,你应该包括你正在使用的语言。我在Windows上用C++编写。我不太明白你的意思。假设我得到(12,13,14),这当然是黑色的一种变体,我想把它解释为黑色,矩阵中会有什么值?你会用人类可读的颜色将每个RGB值映射到最近的点。谢谢tim,但我有RGB,所以红色值本身没有意义。如果所有3个值都是255、170或85,那么它是灰色的,而不是红色的,那么,如何将RGB的3个值转换为有意义的人类颜色呢?我说过,您需要扩展到3维。因此,您可以在RGB空间中找到已映射到颜色名称的最近点。找到红色、绿色和蓝色的最近映射值,然后获取该颜色名称。这将起作用,只是您应该在实验室颜色空间中计算颜色差异,以便它们与人的感知差异相匹配。@Bull感谢您的评论,我猜你说的是,在实践中,网格可能不会被平均划分,而是根据人类的感知进行划分。谢谢,我将对此进行研究。您知道标准转换库或函数吗?请尝试,通过搜索python color packageI可以轻松找到。只有色调对你一点帮助都没有。如果你只使用色调,你会抛出一条有价值的信息。@pigger:hue是人类所说的“绿色”的意思。“淡绿色”或“灰绿色”或“深绿色”会增加更多信息,但绿-红或紫色是色调。如果要对绿色汽车图像进行分类,则需要查看色调值。@6502他要求“任何其他颜色”和比0.255更精细的值。如果你能用同样的努力得到几乎任何一种颜色,我看不出有什么理由实施一些仅限于基本颜色的东西。您仍然需要将色调值映射到颜色名称