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)
看看结果:

彩色小偷
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是基于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)
看看结果:

比较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)
结果:

可以清楚地看到,Color Thief和ImageMagick直方图中的5种量化颜色都不包含Embed.ly返回的相当明亮的第5种颜色.
再次与您的测试图像进行比较:

"使用更大的调色板然后选择前n种颜色会更好吗?"
你为什么不测试它并发现自己?
这有点像黑客,但这是我所做的:
这会强制 Image Magick 创建一个基本的颜色样本,然后选择这些样本并将它们放入一个颜色样本数组中。
使用 Ben 的示例照片,这是命令和结果:
convert image.png -geometry 16x16 -colors 32 \
-unique-colors -scale 4000% scheme.png
Run Code Online (Sandbox Code Playgroud)