link facebook2 twitter youtube

画像から色を取得する

K-means法を使うと使用している色をいい感じに取得できるそうなので試します。

支配色の求め方

  • PILを使用して画像の取得
  • 画像色ベクトルの取得
  • k-means法で3色に分類。
  • クラスタの数が多いもの順にソート
  • 上位2件を支配色として取得

from PIL import Image
from pprint import pprint
from sklearn import cluster

#対象画像を取得
img = Image.open('test.jpg', 'r')


def get_points(img):
    """
    全ての色を取得
    :param img:
    :return:
    """
    points = []
    w, h = img.size
    for count, color in img.getcolors(w * h):
        points.append(color)
    return points

#kMeansよりクラスタ分解設定(3つ)
ret = cluster.KMeans(n_clusters=3)

points = get_points(img)
#クラスタ分解処理
models = ret.fit(points)

count = {}
for label, feature in zip(models.labels_, points):
    if label not in count:
        count[label] = 0

    count[label] = count[label]+1

#クラスタ内の数でソート
ret = sorted(count.items(), key=lambda x: -x[1])

pprint(ret)

"""
output
array([[ 110.1976895 ,  120.0084302 ,  126.60411663],
       [  59.91289947,   39.05399356,   46.97805472],
       [ 196.31362618,   87.25443583,   46.71993109]])
"""

参考

http://charlesleifer.com/blog/using-python-and-k-means-to-find-the-dominant-colors-in-images/

This Post Was Written By 若井豊

© eggplant