Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What is going on with this article?
@eito_2

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

More than 1 year has passed since last update.

今回は、読み込んだ画像からメインカラーを取得していきます。
通常色のポケモンと色違いのポケモンを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で画像からメインカラーを抽出する

6
Help us understand the problem. What is going on with this article?
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
eito_2

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
6
Help us understand the problem. What is going on with this article?