はい メモです

メモ代わり

画像に使用されているRGBのピクセル数を確認したい

コード

画像に使われるRGBを確認したかったので、RGB数を棒グラフで表示するスクリプトを書いた。棒グラフはそのRGB色で、ピクセル数の多い順に表示。

import time
from PIL import Image
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt

#設定
first = 1 #上位何色からプロットするか
num = 15 #上位何色までプロットするか

# 画像読み込み
img = Image.open("3.png")
img_rgb = img.convert("RGB")
width, height = img_rgb.size

# RGB ピクセル数カウント
num_rgb_px = {}
for x1 in range(width):
    for y1 in range(height):
        r1,g1,b1 = img_rgb.getpixel((x1,y1))

        key = "{:0=3}{:0=3}{:0=3}".format(r1,g1,b1)
        if key in num_rgb_px:
            num_rgb_px.update({key:num_rgb_px[key]+1})
        else:
            num_rgb_px.update({key:1})

# Dataframe化
df = pd.DataFrame(list(num_rgb_px.items()),columns=['RGBkey','count'])
df["R"] = None
df["G"] = None
df["B"] = None

for index, item in df.iterrows():
    r1 = item["RGBkey"][0:3]
    g1 = item["RGBkey"][3:6]
    b1 = item["RGBkey"][6:9]
    df.at[index,"R"] = r1
    df.at[index,"G"] = g1
    df.at[index,"B"] = b1

#ピクセル数順にソート
df_s = df.sort_values("count",ascending=False)

# プロットの為の整形
a=df_s[first:num]["count"]
c=df_s[first:num][["R","G","B"]].values
color_list=[]
for row in c:
    color_list.append([int(num)/255 for num in row])

#プロット
plt.figure()
a.plot(kind="bar",figsize=(10,5)
       ,color=color_list
       ,width=1)
plt.show()

結果

入力した画像

f:id:awkw66:20190224225545p:plain
入力画像(3.png)

得られた結果

f:id:awkw66:20190224231017p:plain
出力画像
※x軸ラベルは、RGB値(R=255,G=111,B=0の場合、"255111000")。Y軸はピクセル数。