算法设计:用于最突出颜色的图像量化

时间:2014-12-17 13:30:04

标签: algorithm colors imagemagick image-manipulation quantization

因此,我正致力于从图像中提取人类感知的主色

举个例子,这是一张照片:https://500px.com/photo/63897015/looking-out-for-her-kittens-by-daniel-paulsson

大多数人会认为“主导”颜色是刺眼的天蓝色。但是,使用标准量化,当您跌落到16种左右以下时,蓝色会完全消失。眼睛只占画布的0.2%,所以去平均值根本不起作用。

项目详细信息:我正在构建一个Rails应用程序,它将接受上传的照片或特定颜色,并将返回一堆具有相似主色的其他照片。设计师将使用该工具查找与其预先存在的配色方案相匹配的库存照片。如果我可以解决技术问题,我还有其他很酷的想法。

目前的研究:过去24小时我都在阅读有关这些内容的所有信息。在我尝试的所有服务中,TinEye是唯一能够正确完成它的服务,但它们是封闭源代码。我不能提供超过1个链接,但你可以谷歌'TinEye Color'找到它。

使用的工具:我正在使用ImageMagick进行图像转换和直方图生成。

期望的结果:当给出那张照片时,我想创建一个5-6种颜色的调色板,其中饱和的天蓝色就是其中之一。

当前方法:我现在的做法是将它减少到32或64种颜色,并寻找饱和度/色调异常值。如果标准偏差很小并且离群值很远,我会将它添加到调色板中。然后我将进一步将照片缩小为4种颜色并将它们组合成5-6色调。

我的问题:我的问题在于ImageMagick的量化算法。我不想采用颜色的平均值,我想用相似的颜色对它们进行分组并采用中位数,有利于饱和的颜色。当我将猫图片减少到32种颜色时,眼睛会变成不饱和的灰色。

所以我问你们,如果你知道任何算法或颜色原理,我会找到从图像中脱颖而出的颜色,而不会将它们模糊在一起。我想要一种实际上在图像中的颜色,而不是4-5种颜色的模糊均值。

从更一般的意义上说,TinEye做得很好,我想知道他们是如何做到的。

2 个答案:

答案 0 :(得分:2)

你说,'主导'颜色是'刺穿眼睛的蔚蓝色

你也说,你想要的结果',饱和的天蓝色是你提取的调色板中的 5-6种颜色之一。

你最终想要'实际出现在图像中的颜色,而不是4-5种颜色的模糊均值。

为了开始解决这个问题,我首先尝试使用'的确切颜色定义来刺穿眼睛的

但在这里我已经被卡住了:刺穿的天蓝色已经是至少20种不同色调的蓝色!看这里,一张裁剪猫眼的图片,缩放级别为1000%:

"Piercing blue eye", at 1000% zoom

那么你想要哪一个?那么,如果最终你想象的蓝色的最佳匹配是 '模糊的意思' 多种颜色组合在一起,哪些不是出现在原始图像中甚至一次?!


更新

这是我第一次拍摄......

1。使用-posterize 8转到更少的颜色

convert 2048.jpg -posterize 8 posterized-8.png

这是猫的眼睛,当被分色并以1000%放大时:

Posterized blue eye at 1000% zoom

2。创建文本“直方图”,描述分色后最常用的12种颜色

convert              \
   posterized-8.png  \
  -format %c         \
  -colorspace lab    \
  -colors 12         \
   histogram:info:-  | sort -n -r

  850708: (172,171,171) #ACABAB srgb(172,171,171)
  370610: (219,219,226) #DBDBE2 srgb(219,219,226)
  262870: (218,201,183) #DAC9B7 srgb(218,201,183)
  162588: (182,182,219) #B6B6DB srgb(182,182,219)
  161739: (182,219,219) #B6DBDB srgb(182,219,219)
  115671: ( 92, 87, 87) #5C5757 srgb(92,87,87)
  102337: (146,109,109) #926D6D srgb(146,109,109)
   86318: ( 67, 46, 46) #432E2E srgb(67,46,46)
   82882: ( 22, 20, 21) #161415 srgb(22,20,21)
   66221: (109,139,154) #6D8B9A srgb(109,139,154)
   58403: (146,146,109) #92926D srgb(146,146,109)
   38949: ( 97,109,146) #616D92 srgb(97,109,146)

3。使用12种最常用的颜色来创建显示调色板的补丁条:

convert      \
   -size 100x100 \
    xc:"srgb(172,171,171)" \
    xc:"srgb(219,219,226)" \
    xc:"srgb(134,119,120)" \
    xc:"srgb(182,182,219)" \
    xc:"srgb(182,219,219)" \
    xc:"srgb(92,87,87)" \
    xc:"srgb(146,109,109)" \
    xc:"srgb(67,46,46)" \
    xc:"srgb(22,20,21)" \
    xc:"srgb(109,139,154)" \
    xc:"srgb(146,146,109)" \
    xc:"srgb(97,109,146)" \
   +append \
    palette.png

这是调色板的样子(它错过了眼睛中非常亮点的颜色):

Palette of 12 most frequently used colors from posterized image

答案 1 :(得分:2)

这是最初的想法......我或其他人可能会进一步发展它。你的声明提示你想要使用饱和的颜色。

首先,从照片中删除所有黑色和白色,因为它们是不饱和的。然后转换为HSL颜色空间并提取饱和度通道。对比度将饱和度拉伸至全范围,然后在应用ImageMagick的颜色量化算法时将其用作遮罩。

convert cat.png -fuzz 20% -fill black \
    -opaque white                     \
    -opaque black                     \
    -colorspace HSL -channel S -separate -contrast-stretch 0.1% out.png

enter image description here