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
>>>
よし、いい感じ。では次は、色の使用量を%表示してみよう。