如何(大致地)根据CMYK或RGB数字推广颜色名称?

3
我正在逐像素处理图像,我需要获取每个像素的颜色名称。我有这些主要颜色名称:黄色、洋红色、青色、红色、绿色、蓝色、白色、黑色。我也有每个像素的RGB和CMYK数值。基于这些数字,我如何将像素的颜色大致近似到上述其中一个颜色?它不需要非常精确,只是一个非常一般性的近似值。是否有任何数学方法可以使用RGB或CMYK来确定呢?我宁愿选择简单的解决方案而不是精确的解决方案。

你想知道如何根据颜色的青色、洋红色、黄色和黑色成分来判断它是否主要是黄色?你至少尝试过吗? - beaker
比如说,我有一个RGB值为(70,200,220)的像素。我该如何确定它是黄色、洋红色、青色等颜色中的哪一种? - Army
那种颜色的CMYK值是多少? - beaker
对于这个特定的问题,它将是(68%,9%,0%,14%)。 - Army
1
我无法确定您是否正在查看颜色图像或CMYK值。因此,让我建议一下:如果您将CMYK值转换为最大值为1,最小值为0。然后,对于另外两种颜色,根据它们的值是更接近最大值还是最小值,分配给它们1或0。现在,您有一个包含16个可能值的表格,应该能够将其映射到8种颜色中。 - beaker
显示剩余5条评论
2个回答

2
让我们把这个作为起始图像:

enter image description here

现在,制作一个我们要查找的所有颜色的地图,记住 ImageMagick 使用 X11 颜色名称,其中 green 被命名为 lime
magick xc:black xc:white xc:red xc:lime xc:blue xc:cyan xc:magenta xc:yellow +append map.png

这使得我放大了它,因为它只有8个像素宽和1个像素高:

enter image description here

现在,我们只需要让imageMagick将原始图像中的所有像素映射到最接近我们颜色地图中的颜色即可:
magick artistic-swirl.jpg +dither -remap map.png result.png

enter image description here

现在我们来看一下结果的颜色映射中像素的分布情况:
magick identify -verbose result.png | grep -A9 Histogram

输出

 Histogram:
      5063: (0,0,0) #000000 black
     40831: (0,0,255) #0000FF blue
      2831: (0,255,0) #00FF00 lime
     44027: (0,255,255) #00FFFF cyan
     61648: (255,0,0) #FF0000 red
     29828: (255,0,255) #FF00FF magenta
     38729: (255,255,0) #FFFF00 yellow
     27043: (255,255,255) #FFFFFF white

我们可以看到有5063个像素是黑色的,40831个像素是蓝色的...等等。
请注意,您可以使用Python绑定到ImageMagick的wand库来完成所有这些操作。

柔和的颜色都被映射到了白色,但是人们会称柔和绿色为绿色,而不是白色。“最近”的RGB空间肯定不是人类分类颜色的方式。然而,我没有更好的解决方案...:D - Cris Luengo
@CrisLuengo 在我使用Paddington熊作为图片时,情况更清晰,但显然我不能再使用那张图片了... ‍♂️ 你可以查看编辑历史记录。 - Mark Setchell
你被要求删除那张图片了吗?哇!太疯狂了! - Cris Luengo

0

虽然其他发布的解决方案可以用于已知名称,但是请查看像this这样的模型和论文,以实际推广并了解如何将(甚至)未知颜色转换为有用的名称。

编辑:尽管这不是OP想要的,但我最终花了几个小时将其全部连接起来,以便在Docker / VSCode中轻松使用。请参见here,以快速启动并运行此存储库的方法。

希望这能帮助到某些人!


不是我目前所需的,但仍然是一个非常有趣的解决方案!我会去看看。 - Army

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