こんにちは。
今回は画像処理の方法としてのImageio
の使い方について解説します。
以下の記事ではPythonでデータを扱い際に使用するライブラリのうち、Pillowを用いた画像の処理の仕方について学びました。
PythonでのPillowの使い方【手順あり】
続きを見る
今回は内部でPillowを使用して画像処理を行うライブラリである Imageio について解説します。
Imageioの特徴としては、取り込んだ画像の情報(ピクセル単位)を ndarray 形式に変換してくれる点にあります。
Imageioの使い方について一から解説
画像の読み込み方
Imageio
を使うために、Pillow
で使用した時の様にまずはJupyter Notebookを起動しましょう。
起動したら、下記のアイコン画像として tommy.png
を保存してください。(右クリックして「名前をつけて保存」すればokです。(ファイル名は tommy.png
としてください。))※ アイコンのキャラクターが tommy なので、名前は気にしないでください。
ダウンロードが終われば、AWSのCloud9へアップロードしてください。アップロードする場所は作業を行うファイルを作成したフォルダと同じディレクトリにしましょう。
次に tommy.png を読み込みます。
この画像を使用して処理していきます。
それでは imageio
をインポートしてみます。
NumPy
, Matplotlib.pyplotも同時にインポートしておきましょう
1 2 3 | import imageio import numpy as np import matplotlib.pyplot as plt |
次にImageioを利用して画像を読み込むには imageio.imread()
を使います。
imageio.imread("画像ファイル")
でok です。
今回は通常バージョンのtommyとモノクロバージョンのtommyの"type
"を調べてみます。
1 2 3 4 5 | color_image = imageio.imread("tommy.png") gray_image = imageio.imread("gray_tommy.png") print(type(color_image)) print(type(gray_image)) |
出力結果です。
1 2 | <class 'imageio.core.util.Image'> <class 'imageio.core.util.Image'> |
この出力結果ですが、imageio.core
・・・というようなImageioのデータ型です。
ちなみにこのデータ型は ndarray になっています。ndarray のshape
を調べると配列の要素数を確認する事ができます。
ここではJupyter notebookを使用していますので 入力結果 = In[] として書いていきます。
入力結果
1 2 | print(color_image.shape) print(gray_image.shape) |
出力結果
1 2 | (342, 356, 4) (342, 356) |
ここで出力結果に記載されている数値について解説します。
342
, 356
は、画像の縦幅(342px)と横幅(356px)を意味しています。
つまり 記載された数字のサイズの二次元配列が作られている と認識してください。
グレースケールの色調の表し方は、白色〜黒色のレベル(0 = 黒 → 255 = 白)で表現されます。
カラーの色調の表し方は(342, 356, 4)
のように、(342, 356, )
の二次元配列に加えて、最後の( , 4
) が加味される事で三次元配列となります。
最後の数値が( , 3) という様な記載であれば、要素数は3つある事を意味します。
その場合、3原色のレベルが255段階で保存されている、という事を意味します。要素の並び順はRGB(赤、緑、青)です。
しかし今回の場合は3ではなく、4と表されています。
これはRGBの3色に加えて、透過率が加わったため、「情報として4つある」という意味で4と記載されています。
まとめると、通常は引数の最後の数値は RGBの 3色を指定しますが、 透過が入るとRGBA と4つの要素(色)になります。
RGBAとして出力される時は、png拡張子の画像を使用した時に多いです。背景が含まれて出力されるため透過性の因子が加わってこの様に出力されます。
それではImageioを使用して、実際に画像を表示をしてみましょう。
ndarray
形式でデータが管理されていますが、Pillow のときと同様 matplotlib.pyplot の plt.imshow()
を実行することで、グラフと同じような形式で画像を表示できます。引数に画像のオブジェクトを指定してください。
試しに画像の左上の最端にあるピクセル(0行0列)の情報を見てみます。
入力結果
1 2 | print(color_image[0][0]) print(gray_image[0][0]) |
※color_image[0][0]
, gray_image[0][0]
の [0][0]
は0行0列を意味します。
出力結果
1 | plt.imshow(color_image) |
入力
1 | plt.imshow(gray_image, cmap = "gray") |
数値で画像データを表現できるメリット
数値(ピクセル単位の情報をndarray形式で持つ)で画像データを表現できる事のメリットとして、数値計算で画像加工が可能になります。
また、機械学習においては画像データをピクセル単位で数値化する事が非常に重要となります。
そうする事で、機械学習の際に画像の分類を行う事ができるようになるためです。
明るさの分布を表示
次に画像の情報をヒストグラム = 明るさの分布で表示してみましょう。
ヒストグラム(histogram)は NumPy の np.histogram()
を使用すればokです。
1 2 3 | hist_c, bins_c = np.histogram(color_image.flatten(), bins=256) plt.plot(hist_c) |
出力結果は以下です。明るさの分布はこのようになっています。
このように画像データを数値化する事ができます。
まとめ|Imagioの使い方
今回はImageio について学びました。
PillowとImageioを用いる事で、Pythonで簡単に画像の加工をする事が出来るようになります。
画像を加工することは非常に役立つ事が多いので是非習得してください。