确定图片的主色

时间:2015-04-03 02:11:26

标签: image algorithm image-processing colors

我正在尝试提出一种算法来确定图像中的主色(从设备相机中获取或通过选择照片库中的现有照片)。我在Swift中编写了一个iOS 8应用程序,它可以获取图像中每个像素的RGB值,但我真的不知道该怎么做。

对于具有明显主色的像素,例如RGB(230,15,30),很容易确定主色。但是,我真的不知道如何处理具有RGB值的像素,其中3个值中的2个相似,例如RGB(200,215,30)。

我最初的想法是保留3个计数器(每种颜色一个)并将每个像素对应的RGB值添加到该计数器。最后,我将每个计数器除以总像素数,并且3个值中的最大值将是主色。但是,就像我之前提到的那样,当结果彼此接近时,我不能说一种颜色必然支配另一种颜色。

只是寻找一些想法和建议

4 个答案:

答案 0 :(得分:1)

一个想法:

  1. 第一步是减少颜色数量,例如"Color Quantization using K-Means"。在链接的示例中,颜色数量从96K减少到64。

  2. 第二步是计算每种颜色的比例并选择最大值。

答案 1 :(得分:1)

你可以查看我的爱好项目,找到UIImage中的主色:https://github.com/ruuki/ColorFinder

它的作用基本上是创建图像的颜色簇,并返回完成块中最主要的颜色。您可以在源代码中调整阈值参数。希望它有所帮助。

答案 2 :(得分:1)

我有类似的任务要做,这是我的python代码:

import picamera
import picamera.array
import numpy as np
from math import sqrt, atan2, degrees

def get_colour_name(rgb):
    rgb = rgb / 255
    alpha = (2 * rgb[0] - rgb[1] - rgb [2])/2
    beta = sqrt(3)/2*(rgb[1] - rgb[2])
    hue = int(degrees(atan2(beta, alpha)))
    std = np.std(rgb)
    mean = np.mean(rgb)
    if hue < 0:
        hue = hue + 360
    if std < 0.055:
        if mean > 0.85:
            colour = "white"
        elif mean < 0.15:
            colour = "black"
        else:
            colour = "grey"
    elif (hue > 50) and (hue <= 160):
        colour = "green"
    elif (hue > 160) and (hue <= 250):
        colour = "blue"
    else:
        colour = "red"
    if DEBUG:
        print rgb, hue, std, mean, colour
    return str(int(hue)) + ": " + colour

def scan_colour:
    with picamera.PiCamera() as camera:
        with picamera.array.PiRGBArray(camera) as stream:
            camera.start_preview()
            camera.resolution = (100, 100)
            for foo in camera.capture_continuous(stream, 'rgb', use_video_port=False, resize=None, splitter_port=0, burst=True):
                stream.truncate()
                stream.seek(0)
                RGBavg = stream.array.mean(axis=0).mean(axis=0)
                colour = get_colour_name(RGBavg)
                print colour

scan_colour()

我的想法是建立所有像素的平均颜色并确定色调角度以外的颜色。为了获得灰度答案,我想检查颜色是否接近颜色语料库的中间线。

答案 3 :(得分:1)

几周前,我想到了这个问题,并且阅读了很多有关此问题的文章后,发现最好的方法是这篇文章http://aishack.in/tutorials/dominant-color/提出的“分层量化”。另外,我已经在python:https://github.com/wenmin-wu/dominant-colors-py中实现了它。您可以使用pip:pip install dominantcolors进行安装,并按以下方式使用它:

from dominantcolors import get_image_dominant_colors
dominant_colors = get_image_dominant_colors(image_path='/path/to/image_path',num_colors=3)