16

我需要生成图像中前 5 种主色的调色板。我想复制Embedly 的提取工具Color Thief的结果。

以下命令给了我稍微不同的结果:

convert testimage.jpg  -format %c -colorspace LAB -colors 5 histogram:info:- | sort -n -r
    157154: ( 19, 28, 35) #131C23 srgb(19,28,35)
     16164: ( 27, 51, 77) #1B334D srgb(27,51,77)
     15725: ( 79, 88, 84) #4F5854 srgb(79,88,84)
      8608: ( 44, 77,103) #2C4D67 srgb(44,77,103)
      5149: ( 84,126,150) #547E96 srgb(84,126,150)

我有点不确定是否应该量化为 5 种颜色,因为我发现这样做不适用于简单的图形(例如 Google 徽标)。使用更大的调色板然后只选择前n 个颜色会更好吗?

这让我想到了关于所使用的量化算法的下一个问题。查看 Embedly Extract 的结果,输出颜色不一定是最频繁的,但似乎是彼此最不同的集群。

例如,假设我有一个非常暗的图像(黑色/棕色),其中有一个小细节是鲜红色的。我如何确保 ImageMagick 包含红色?(抱歉,如果这听起来很愚蠢,色彩理论对我来说是全新的!)。

下面是我一直用于测试的图像:

在此处输入图像描述

4

2 回答 2

26

你能定义“前 5 种主色”吗?我认为这并不像听起来那么容易...

访问您为Embed.lyColor Thief对您的测试图像的解释提供的链接时,可以看到不同的结果清楚地表明了这一点。

嵌入

下面是 Embed.ly 列出的 5 种提取颜色(我查看了页面的 HTML 源代码以找出答案):

 rgb(13, 28, 37)
 rgb(44, 74, 94)
 rgb(71, 112, 131)
 rgb(105, 147, 163
 rgb(198, 209, 216)

使用 ImageMagick 创建具有以下 5 种颜色的调色板:

 convert                        \    
     -size 60x60                \    
      label:"        Embed.ly"  \
      xc:"rgb(13, 28, 37)"      \    
      xc:"rgb(105, 147, 163"    \    
      xc:"rgb(71, 112, 131)"    \    
      xc:"rgb(44, 74, 94)"      \    
      xc:"rgb(198, 209, 216)"   \
     +append                    \    
      embedly-palette-from-testimage.jpg

看看结果:

Embed.ly 精选的 5 种颜色...

颜色小偷

Color Thief 将一种颜色命名为“主要”颜色:

 rgb(21, 30, 38)

Color Thief 还列出了另外 9 种颜色的调色板(同样是从 HTML 源代码中检索的值):

 rgb(18, 27, 35)
 rgb(100, 142, 164) 
 rgb(51, 84, 110) 
 rgb(32, 53, 74)
 rgb(47, 46, 43)
 rgb(83, 85, 76)
 rgb(145, 143, 128) 
 rgb(106, 141, 140) 
 rgb(62, 84, 81)

使用 ImageMagick 创建具有 Color Thief 的 9 种调色板颜色的调色板:

 convert                        \    
     -size 60x60                \    
      label:"     Color Thief"  \
      xc:"rgb(18, 27, 35)"      \    
      xc:"rgb(100, 142, 164)"   \
      xc:"rgb(51, 84, 110)"     \    
      xc:"rgb(32, 53, 74)"      \    
      xc:"rgb(47, 46, 43)"      \    
      xc:"rgb(83, 85, 76)"      \    
      xc:"rgb(145, 143, 128)"   \
      xc:"rgb(106, 141, 140)"   \
      xc:"rgb(62, 84, 81)"      \    
     +append                    \    
      ct-palette-from-testimage.jpg

看看结果:

Color Thief 的 9 种提取颜色调色板...

颜色小偷是基于quantize.js. 它使用提供的中值切割算法quantize.js对相似的颜色进行聚类,然后从最大的聚类中返回基色作为“主导”颜色。

它如何确定将哪些颜色作为“调色板颜色”返回可以从其托管在 Github 上的源代码中确定。

ImageMagick 的 5 种量化颜色

您的问题仅在将图像量化为 5 种颜色后列出了 ImageMagick 直方图的输出。

使用这 5 种颜色来创建另一个调色板:

 convert                        \
     -size 60x60                \
      label:"   ImageMagick"    \
      xc:"srgb(19,28,35)"       \
      xc:"srgb(79,88,84)"       \
      xc:"srgb(44,77,103)"      \
      xc:"srgb(27,51,77)"       \
      xc:"srgb(84,126,150)"     \
     +append                    \
      im-palette-from-testimage.jpg

看看结果:

ImageMagick 的 5 种量化颜色...

比较 3 个调色板

使用此命令创建 3 个调色板的视觉比较:

 convert                                    \
      ct-palette-from-testimage.jpg         \
      embedly-palette-from-testimage.jpg    \
      im-palette-from-testimage.jpg         \
     -append                                \
      color-palettes.jpg

结果:

3个创建的调色板的直接视觉比较......

可以清楚地看到,Color Thief 和 ImageMagick 直方图中的 5 种量化颜色都没有包含 Embed.ly 返回的相当明亮的第 5 种颜色。

再次与您的测试图像进​​行比较:

测试图像...

“使用更大的调色板然后只选择前 n 个颜色会更好吗?”

你为什么不测试它并找出你自己呢?

于 2014-11-13T19:32:44.853 回答
5

这有点hack,但这是我所做的:

  • 将图像缩小到 8x8 或 16x16,
  • 将颜色深度限制为 16 或 24 或 32
  • 从缩放的图像中选择独特的颜色并将它们转储到文件中

这会强制 Image Magick 创建一个基本的颜色样本,然后选择它们并将它们放入色样阵列中。

使用 Ben 的示例照片,以下是命令和结果:

convert image.png -geometry 16x16 -colors 32 \
-unique-colors -scale 4000% scheme.png

图像魔术师

于 2018-07-06T05:42:18.267 回答