使用ImageMagick从图像生成调色板

时间:2014-11-12 14:28:20

标签: colors imagemagick quantization

我需要生成图像中前5种主色的调色板。我想要复制Embedly's extract toolColor 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包含红色? (道歉,如果这听起来很愚蠢,色彩理论对我来说都是新的!)。

以下是我用于测试的图片:

enter image description here

2 个答案:

答案 0 :(得分:18)

你能定义"前5种主色",拜托?我觉得这听起来并不容易......

访问您为 Embed.ly 提供的链接以及 Color Thief &#时可以看到的不同结果清楚地显示了这一点。 39;对你的测试图像的解释。

<强> Embed.ly

以下是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's pick of 5 colors...

彩色小偷

Color Thief将一种颜色命名为&#34;显性&#34; 颜色:

 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's palette of 9 extracted colors...

Color Thief基于quantize.js。它使用quantize.js提供的中值切割算法来聚类相似的颜色,然后从最大的聚类返回基色作为&#34;显性&#34;颜色。

如何确定要返回的颜色为&#34;调色板颜色&#34;可以从其源代码确定,即hosted on 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's 5 quantized colors...

比较3个调色板

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

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

结果:

Direct visual comparison of 3 created color palettes...

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

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

Test image...

  

&#34;使用更大的调色板然后选择前n种颜色会更好吗?&#34;

为什么不测试它并发现自己?

答案 1 :(得分:0)

这有点骇人听闻,但这是我的工作:

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

这将迫使Image Magick创建基本的颜色样本,然后选择这些颜色并将其放入颜色样本阵列中。

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

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

imagemagick