2018年3月3日土曜日

Python初心者がimageモジュールで画像と戯れる

今回はPythonのPillowライブラリにあるimageモジュールを使って画像ファイルを変換して遊んでみます。これってきっと機械学習のデータセットで画像を扱う時に役に立つはず、って自分に言い聞かせてます。




本題


インストール方法


これは簡単。Anacondaからインストールしたい仮想環境のコンソールを起動して
pip install pillow 
と入力するだけです。


画像を読み込む


まず、画像ファイルを読み込んでみます。データセットとして使うなら読み込む必要がありますからね。次のコードで画像ファイルを読み込んで、オブジェクトに入れる事ができました。

Python Code
# 画像を扱うライブラリーをインポート
from PIL import Image
# 画像ファイルをIMというオブジェクトに読み込み
IM = Image.open('./image/1-3.jpg')
これでimageフォルダにある『1−3.jpg』がIMに入っています。ここで素人であるりばーにはです。画像ファイルがIMというオブジェクトに入ってるってどういう状態ですか??
という訳でもう少し遊んでみて理解を深めます。
ちなみに読み込んだ『1−3.jpg』という画像ファイルはこういう画像です。
3
手書きの3ですね。MNISTの手書き文字です。
では、手始めに

Python Code
# 書き出してみる
print(IM)
とやってみると
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=28x28 at 0x109722358>
 と結果が表示されました。なんやらよく分かりませんが、RGBでサイズが28x28なんだと。合ってますね。でも欲しいのはそういうんじゃないです。


色情報の取得


次の関数で画像情報の取得ができるそうなのでそれをやってみます。

Python Code
# 画像情報の取得 全体
rec = IM.getdata()
# 画像情報の取得 座標指定(15,15)
px = IM.getpixel((15, 15))

getdataで全体取得、getpixelは座標指定で取得とのことです。取得した情報を書き出してみます。

Python Code
print(rec[1])
print(px)

結果
(255, 255, 255)
(1, 1, 1)
色情報が取れてますね。ぽくなってきました。RGBなので、上が白、座標(15,15)は黒ということです。ちなみにrecを配列として表示したのは、そうしないと上手く表示できなかったからです。


色情報の検証


続いてrecの長さを取ってみます。
Python Code
# recの長さを調べてみる
print(len(rec))
784
28x28は784なのでどうやらピクセル数になっているようです。ということはgetpixelで取得した座標(15,15)は15x15=225でrecの225番目を指定すると黒になるのかな。(たまたま黒の確率は高いですが...)

Python Code
# recの225番目を調べてみる
print(rec[224])
(255, 255, 255)
あれ?ならない。どういう順番で並んでるんだろう。次のコードで読み込んだ画像ファイルの全ての色情報を書き出す事ができます。

Python Code
# recの中身を全部書き出す
for i in range(len(rec)):
print(rec[i])
とやっても784行出るのでちょっと分かりにくいです。もう少し見る方に優しくなるように改造してみます。

Python Code
# recの中身を全部書き出す
for i in range(len(rec)):
# y座標の計算
y = i // 28
# x座標の計算
x = i - (i // 28 * 28)
# 座標と色情報を書き出し
print(str(x) + ', ' + str(y) + ' :' + str(rec[i]))
順番iを28で割る事で、何行目か分かります。(Y座標)
更に行数に28かけた数値を順番iから引くと、何列目か分かりますね。(X座標)
というか、これを作って気づきました。計算式が間違っていましたね。getpixelは座標が0からスタートしているので、実際には16行目の16列目ですし、計算式も16x16ではなくて、
16行目の位置:(16-1)x28=420。
更に16番目なので+16して、436となるはずです。
確かめてみます。(上の784行の結果でも分かりますが)
Python Code
# recの436番目を調べてみる
print(rec[435])
(1, 1, 1)
これで getpixelの結果と一致しました。


まとめ


今回分かった事。
Image.open('〜〜〜')
で、画像ファイルを読み込んでオブジェクトに格納できます。更に
IM.getdata()
で、その画像の色情報を取得できます。この時格納される変数は左上からのピクセル順の配列になっており、その値の中身はRGBで構成されています。

本当は画像の編集とか出力とかもやりたかったですが、思いのほか読み込みだけで長くなってしまったので今日はここまでにして、次回も画像操作の続きをして行きたいと思います。

0 件のコメント:

コメントを投稿

Popular Posts