获得图像主色的快速方法

34 algorithm photo image colors ios

我有一个关于如何获得图像主色(照片)的问题.我想到了这个算法:循环遍历所有像素并获得它们的颜色,红色,绿色,黄色,橙色,蓝色,洋红色,青色,白色,灰色或黑色(当然有一些边缘)和它的黑暗(浅,黑或然后检查哪种颜色最多.我认为这很慢而且不太精确.有没有更好的办法?


如果重要的话,它是从iPhone或iPod touch相机获取的UIImage,最多为5 Mpx.它必须快速的原因是简单地显示进度指示器并不是很有意义,因为这是针对视力不好或根本没有视力的人的应用程序.因为它适用于移动设备,所以可能不会占用太多内存(最多50 MB).

pay*_*yne 30

您的一般方法应该有效,但我会强调一些细节.

而不是您给定的颜色列表,在色谱中生成许多颜色"分档"来计算像素.这是另一个有一些算法的问题:生成光谱调色板使可以配置的数量,这样你就可以尝试获得你想要的结果.

接下来,对于您正在考虑的每个像素,您需要找到要增加的"最近"颜色区域.你需要定义"最近的"; 看到这篇关于"色差"的文章:http://en.wikipedia.org/wiki/Color_difference

为了提高性能,您无需查看每个像素.由于图像元素通常覆盖大面积区域(例如,天空,草等),因此只需采样几个像素即可获得所需的结果.我猜你每10个像素,甚至每100个像素都可以得到很好的结果.您也可以尝试这个因素.

[编者注:以下段落经过编辑,以适应Mike Fairhurst的评论.]

平均像素也可以完成,如本演示中所示:jsfiddle.net/MUsT8/

  • 我刚刚发布了一个小的javascript库(http://pieroxy.net/blog/pages/color-finder/index.html),它几乎完成了你所描述的内容.您还可以通过反馈方法将算法倾向于您的颜色偏好.这是一个现场演示:http://pieroxy.net/blog/pages/color-finder/demo.html.希望这可以帮助. (4认同)
  • 平均颜色的演示显示绿色背景,因为有一个拼写错误,其中RGB背景颜色设置为绿色和蓝色值位于错误的位置.通过此更正,"平均"RGB是蓝色,正如您对非常蓝色的示例图像所期望的那样. (2认同)