使用ImageMagick从图像生成调色板

Ben*_*ter 9 colors imagemagick quantization

我需要生成图像中前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)
Run Code Online (Sandbox Code Playgroud)

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

这引出了我关于所使用的量化算法的下一个问题.看看Embedly Extract的结果,输出颜色不一定是最常见的,但看起来是彼此最不同的聚类.

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

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

在此输入图像描述

Kur*_*fle 19

你能定义"前5大主色"吗?我觉得这并不像听起来那么容易......

访问您为Embed.ly提供的链接以及Color Thief对您的测试图像的解释时,可以看到不同的结果.

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)
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

看看结果:

Embed.ly挑选5种颜色......

彩色小偷

Color Thief将一种颜色命名为"主导"颜色:

 rgb(21, 30, 38)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

看看结果:

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

Color Thief是基于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
Run Code Online (Sandbox Code Playgroud)

看看结果:

ImageMagick的5种量化颜色......

比较3个调色板

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

 convert                                    \
      ct-palette-from-testimage.jpg         \
      embedly-palette-from-testimage.jpg    \
      im-palette-from-testimage.jpg         \
     -append                                \
      color-palettes.jpg
Run Code Online (Sandbox Code Playgroud)

结果:

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

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

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

测试图像......

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

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

  • @Skrylar:但我确实这么认为。因为从我那里得到这条评论的子问题的子答案很受个人喜好的影响。我的完整答案使原始发布者能够运行所有工具和命令,这些工具和命令可以帮助他生成视觉输出,然后他可以查看并找出自己 *** 他*** 对那个子问题的个人回答是什么 *“是吗更好......?”*,因为这很可能与***我的***各自的答案不同...... (3认同)

Kla*_*ker 5

这有点像黑客,但这是我所做的:

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

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

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

convert image.png -geometry 16x16 -colors 32 \
-unique-colors -scale 4000% scheme.png
Run Code Online (Sandbox Code Playgroud)

图像魔术师