一尘不染

快速获得图像主色的方法

algorithm

我有一个关于如何获得图像(照片)主色的问题。我想到了这种算法:遍历所有像素并获得其颜色,红色,绿色,黄色,橙色,蓝色,品红色,青色,白色,灰色或黑色(当然会有一定的余量),并且它是黑暗的(亮,暗或暗)。正常),然后检查出现最多的颜色。我认为这很慢,也不是很精确。有没有更好的办法?


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


阅读 200

收藏
2020-07-28

共1个答案

一尘不染

您的一般方法应该可行,但是我要强调一些细节。

代替您给定的颜色列表,在色谱中生成许多颜色“
bin”以计数像素。这是另一个有一些算法可以解决的问题:生成光谱调色板使箱数可配置,以便您可以尝试获得所需的结果。

接下来,对于要考虑的每个像素,您需要找到“最近”颜色容器以递增。您需要定义“最近”;请参阅有关“色差”的文章:http
:
//en.wikipedia.org/wiki/Color_difference

为了提高性能,您无需查看每个像素。由于图像元素通常会覆盖较大的区域(例如,天空,草地等),因此只需采样几个像素即可获得所需的结果。我猜想您每十个像素甚至每一百个像素采样都可以获得良好的结果。您也可以尝试该因素。

[编者注:为适应Mike Fairhurst的评论,对以下段落进行了编辑。]

也可以对像素进行平均,如本演示所示:jsfiddle.net/MUsT8/

2020-07-28