"Diary" インターネットさんへの恩返し

いつもソースコードコピペばかりなので,みなさまへ少しばかりの恩返しを

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

>>>


よし、いい感じ。では次は、色の使用量を%表示してみよう。