找出图像中的主导/最常见的颜色
我正在寻找一种方法来使用python在图像中找到最主要的颜色/色调。 无论是平均阴影还是最常见的RGB都可以。 我已经看了一下Python影像库,并且在他们的手册中找不到与我正在查找的内容有关的任何内容,并且在VTK中也进行了简要介绍。
但是我找到了一个PHP脚本,它可以完成我所需要的功能,在这里(登录需要下载)。 该脚本似乎将图像大小调整为150 * 150,以突出显示颜色。 但之后,我相当迷茫。 我曾考虑编写一些将图像大小调整为小尺寸的图像,然后检查其他像素或其它图像,但我认为这会非常低效(尽管将此想法实现为C python模块可能是一个想法)。
然而,毕竟,我仍然难倒了。 所以我转向你,所以。 有没有一种简单而有效的方式来找到图像中的主色。
这是使用PIL和Scipy的群集软件包的代码。
为了简单起见,我将文件名硬编码为“image.jpg”。 调整图像大小是为了提高速度:如果您不介意等待,请将调整大小调出注释。 当在这个蓝色辣椒的样品图像上运行时,它通常会说主色是#d8c865,它大致对应于两个辣椒左下角的亮黄色区域。 我说“通常”是因为使用的聚类算法对它有一定程度的随机性。 有多种方法可以改变这一点,但出于您的目的,它可能适合。 (如果需要确定性结果,请查看kmeans2()变体上的选项。)
import struct
import Image
import numpy as np
import scipy
import scipy.misc
import scipy.cluster
NUM_CLUSTERS = 5
print 'reading image'
im = Image.open('image.jpg')
im = im.resize((150, 150)) # optional, to reduce time
ar = np.asarray(im)
shape = ar.shape
ar = ar.reshape(scipy.product(shape[:2]), shape[2]).astype(float)
print 'finding clusters'
codes, dist = scipy.cluster.vq.kmeans(ar, NUM_CLUSTERS)
print 'cluster centres:n', codes
vecs, dist = scipy.cluster.vq.vq(ar, codes) # assign codes
counts, bins = scipy.histogram(vecs, len(codes)) # count occurrences
index_max = scipy.argmax(counts) # find most frequent
peak = codes[index_max]
colour = ''.join(chr(int(c)) for c in peak).encode('hex')
print 'most frequent is %s (#%s)' % (peak, colour)
注意:当我扩大聚类数量以找到从5到10或15时,它经常给出绿色或蓝色的结果。 鉴于输入图像,这些结果也是合理的结果......我无法确定哪种颜色在该图像中占主导地位,所以我不会错误地使用算法!
还有一个小小的好处:只用N种最常见的颜色保存缩小图像:
# bonus: save image using only the N most common colours
c = ar.copy()
for i, code in enumerate(codes):
c[scipy.r_[scipy.where(vecs==i)],:] = code
scipy.misc.imsave('clusters.png', c.reshape(*shape))
print 'saved clustered image'
Python Imaging Library在Image对象上有方法getcolors:
im.getcolors() =>(count,color)元组列表或None
我想你还可以在这之前尝试调整图像大小,看看它是否有更好的表现。
您可以使用PIL在每个维度中将图像重复调整大小2倍,直至达到1x1。 我不知道PIL使用什么算法来缩小大尺寸因素,因此直接在单个调整大小时直接使用1x1可能会丢失信息。 它可能不是最高效的,但它会给你图像的“平均”颜色。
链接地址: http://www.djcxy.com/p/61559.html