我正在尝试提出一种算法来确定图像中的主色(从设备相机中获取或通过选择照片库中的现有照片)。我在Swift中编写了一个iOS 8应用程序,它可以获取图像中每个像素的RGB值,但我真的不知道该怎么做。
对于具有明显主色的像素,例如RGB(230,15,30),很容易确定主色。但是,我真的不知道如何处理具有RGB值的像素,其中3个值中的2个相似,例如RGB(200,215,30)。
我最初的想法是保留3个计数器(每种颜色一个)并将每个像素对应的RGB值添加到该计数器。最后,我将每个计数器除以总像素数,并且3个值中的最大值将是主色。但是,就像我之前提到的那样,当结果彼此接近时,我不能说一种颜色必然支配另一种颜色。
只是寻找一些想法和建议
答案 0 :(得分:1)
一个想法:
第一步是减少颜色数量,例如"Color Quantization using K-Means"。在链接的示例中,颜色数量从96K减少到64。
第二步是计算每种颜色的比例并选择最大值。
答案 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)