python のPILで画像処理を試してみる(分析系編)
スポンサーリンク
分析してみる
とりあえず、画像データをCSVに出力する。
画像ファイルからピクセル情報を取得する
from PIL import Image #保存するファイル名 f = open('text.txt', 'w') #解析対象画像ファイル image = Image.open('girls.png') px = image.getdata() cnt = 0 for s in px: #適当にサンプリングする条件を指定 if cnt%3 == 0: s = str(s) #不要な文字列を削除 s = s.replace('(', '') s = s.replace(')', '') #配列に分解 data = s.split(",") #10進数で得たい場合 #datas = data[0] + "," + data[1] + "," + data[2] + "," + data[3] + "\n" #16進数で得たい場合 datas = '#' + '%x' % int(data[0]) + '%x' % int(data[1]) + '%x' % int(data[2]) + "," + data[3] + "\n" f.write(str(datas)) cnt = cnt + 1 f.close()
分析対象データは、上のpythonスクリプトで得た、CSVデータ。
左がRGBで、右がアルファだと思われる。(思われるって。。。)
#6c6d5d, 1 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 #ffffff, 0 ・ ・ ・
以下の分析スクリプトを実行する。
>>> import scipy as sp >>> import numpy as np >>> import pandas as pd >>> from pandas import DataFrame, Series >>> data = pd.read_csv("text.txt", sep=",") #データの統計表示 >>> data.describe() 1 count 1085455.000000 mean 152.003263 std 124.538755 min 0.000000 25% 0.000000 50% 255.000000 75% 255.000000 max 255.000000 #[http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.value_counts.html:title=value_countsメソッド]でユニークな値の出現回数をカウントし降順で表示。 >>> for col in data: ... print pd.value_counts(data[col]) ... print "\n" ... #以下はRBG列について #ffffff 430677 #fff4de 1163 #fff2df 1088 #fff6e4 1021 #fff8e6 966 #ffeeda 924 #fef3df 882 #fff4e0 872 #fff5df 869 #fff3e0 865 #fdf5e0 841 #fff3e3 835 #fff7e5 799 #fdf2de 770 #fef6e1 763 ... #8c5e3d 1 #ff7a8f 1 #d36d92 1 #d89278 1 #d89279 1 #89836b 1 #89836d 1 #fdad92 1 #a85c5e 1 #afc2c0 1 #baa295 1 #ddc2b9 1 #c1d4ce 1 #b2a176 1 #8c9093 1 Length: 130039, dtype: int64 #以下はα列について 255 629970 0 430719 254 2393 253 1408 252 968 251 809 250 600 249 566 248 497 247 442 246 380 1 321 245 318 244 272 240 230 ... 93 32 82 32 160 32 85 31 99 31 147 31 133 31 111 31 118 30 108 30 65 30 153 28 91 28 130 26 80 26 Length: 256, dtype: int64 >>>
よし、いい感じ。では次は、色の使用量を%表示してみよう。