Help us understand the problem. What is going on with this article?

【Python】スクリーンショットからメインカラーを取得する

今回は、読み込んだ画像からメインカラーを取得していきます。
通常色のポケモンと色違いのポケモンを5つのメインカラーに分けて、比較できるようにします。

インポート

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import argparse
import utils
import cv2
import numpy as np

画像取得

画像をOpenCVで読み込んだ場合、そのままだとBGRになっているためRGBに変換させます。

image_path = "./ウオノラゴン00001.jpg"

image = cv2.imread(image_path)

image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

NumPy配列を形成して、RGBピクセルのリストにします。

image = image.reshape((image.shape[0] * image.shape[1], 3))

k-means

k-meansを使用して最も支配的な色をみつけます。
クラスタ数を5つにし、RGBピクセルのリストをクラスター化させます。

clt = KMeans(n_clusters = 5)
clt.fit(image)

ヒストグラムからメインカラーの割合をだします。

numLabels = np.arange(0, len(np.unique(clt.labels_)) + 1)
(hist, _) = np.histogram(clt.labels_, bins=numLabels)

hist = hist.astype("float")
hist /= hist.sum()

メインカラーを取得

for文で5つメインカラーとその割合を取り出します。

bar = np.zeros((50, 300, 3), dtype="uint8")
cluster_centers_arr = clt.cluster_centers_.astype(int, copy=False)
startX = 0

for (percent, color) in zip(hist, cluster_centers_arr):
    color_hex_str = '#%02x%02x%02x' % tuple(color)
    print(percent , color_hex_str)
    endX = startX + (percent * 300)
    cv2.rectangle(bar, (int(startX), 0), (int(endX), 50),color.astype("uint8").tolist(), -1)
    startX = endX

5つのメインカラーを表示します。

plt.figure()
plt.axis("off")
plt.imshow(bar)
plt.show()

実行結果

元のスクリーンショット(ウオノラゴン)
ウオノラゴン.png

実行結果

0.7486892361111112 #dd4928
0.05908420138888889 #0b0403
0.038871527777777776 #b7d1e0
0.13411458333333334 #d21d1d
0.01924045138888889 #294e37

通常配色.png

元のスクリーンショット(色違い ウオノラゴン)
色違いウオノラゴン.png

実行結果

0.7698796296296296 #dd4828
0.03972407407407407 #c9d0ca
0.026488888888888888 #262220
0.025824074074074076 #6e6166
0.13808333333333334 #d41d1a

色違い配色.png

5つのメインカラーを取得できましたが、そのままだと背景の割合が多くなってしまいました。
背景色のメインカラーを除いた、3色からポケモンのメインカラーを出せたため、
そこから色違いであるかどうかを判断できそうです。

参考

OpenCV and Python K-Means Color Clustering

Pythonで画像からメインカラーを抽出する

eito_2
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした