使用 ImageMagick 从图像生成调色板
Posted
技术标签:
【中文标题】使用 ImageMagick 从图像生成调色板【英文标题】:Generate color palette from image with ImageMagick 【发布时间】:2015-01-09 10:42:14 【问题描述】:我需要生成图像中前 5 种主色的调色板。我想复制Embedly's extract tool 或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 包含红色? (抱歉,如果这听起来很愚蠢,色彩理论对我来说是全新的!)。
下面是我用来测试的图片:
【问题讨论】:
【参考方案1】:这有点小题大做,但我是这样做的:
将图像缩小到 8x8 或 16x16, 将颜色深度限制为 16 或 24 或 32 从缩放的图像中选择独特的颜色并将它们转储到文件中这会强制 Image Magick 创建一个基本的颜色样本,然后选择它们并将它们放入色样数组中。
使用 Ben 的示例照片,以下是命令和结果:
convert image.png -geometry 16x16 -colors 32 \
-unique-colors -scale 4000% scheme.png
【讨论】:
我不会拒绝这个答案,即使它没有考虑到 OP 要求获得 五种 主色和而是返回 9 种不同的颜色... (此外,当您将自己的答案添加到问题中时,本网站的规则不需要对其他答案投反对票。)【参考方案2】:您能定义“前 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)
使用 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
看结果:
色彩小偷
颜色小偷将一种颜色命名为“主导”颜色:
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 基于quantize.js
。它使用quantize.js
提供的中值切割算法对相似的颜色进行聚类,然后从最大的聚类中返回基色作为“主导”颜色。
它如何确定哪些颜色作为“调色板颜色”返回可以从它的源代码中确定,即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
看结果:
比较 3 个调色板
使用此命令创建 3 个调色板的视觉比较:
convert \
ct-palette-from-testimage.jpg \
embedly-palette-from-testimage.jpg \
im-palette-from-testimage.jpg \
-append \
color-palettes.jpg
结果:
可以清楚地看到,Color Thief 和 ImageMagick 直方图中的 5 种量化颜色都没有包含 Embed.ly 返回的相当明亮的第 5 种颜色。
再次与您的测试图像进行比较:
“使用更大的调色板然后只选择前 n 种颜色会更好吗?”
你为什么不测试它并找出自己?
【讨论】:
我已经尝试过使用修改中值切割量化 (MMCQ) 并获得的结果更接近 embedly 的服务。根据white paper 的说法,这可以为具有高度可见性但人口颜色低的图像提供更好的结果。 我不认为告诉某人测试某些东西并“找出自己”真的适合问答网站。 @Skrylar:但我确实这么认为。因为从我这里得到这个评论的子问题的子答案很大程度上受到个人喜好的影响。我的完整答案使原始发布者能够运行所有工具和命令,帮助他生成视觉输出,然后他可以查看并找出自己他的个人答案是什么那个子问题“更好吗...?”,因为这很可能与我的各自的答案不同... 有了这张图片,我发现 color-thief(更准确地说,color-thief-jimp)会产生更加鲜艳和多样的整体颜色(包括更多的绿色,而 imagemagick 很少发现),而 imagemagick 提供更多独特而多样的布鲁斯。似乎 embed.ly 可能更擅长寻找更亮的颜色。我会给出一个屏幕截图,但由于某种原因,这对我现在不起作用。 唉!今天这个答案收到了反对票。如果您还可以提交评论来解释您不喜欢答案的哪些方面,或者您不同意其中的哪些方面,那就太好了。以上是关于使用 ImageMagick 从图像生成调色板的主要内容,如果未能解决你的问题,请参考以下文章
Imagemagick convert -fill不会更改特定调色板区域的边缘