PythonのライブラリーNumPyを使った配列(Array)の操作はすでに学んできました。
NumPyの配列を任意に作ってこれまでは扱ってきましたが、データ分析に関連して最近はAIなどで画像の読み取りなどがよく話題になります。
ここでは画像ファイルとNumPyの配列との関係を使って画像の色の変換をみていきたいと思います。画像処理にはpillow(PIL)を使います。
imageファイルとRGBカラーモデル
imageファイルは、ピクセル単位のデータが縦と横に集まりそれぞれにカラーデータを与えられた配列と考えることができます。これは行と列のデータ構造を持った配列表示です。
縦の行が画像のheightに当たります。横の列が画像のwidthに当たります。それぞれの位置にはカラーのデータが格納されていることになります。
グレースケールでは、0と1の間で白と黒の濃度を示すことになります。
RGBカラーモデルはR(red)、G(green)、B(blue)の3原色を合成して多様な色を表現する方法で、それぞれの色の明度を0から255で示します。
下の画像はKeynoteのカラー表示で、RGBを使ったものです。
NumPyのArrayとimageファイルの読み込み
では、imageファイルの読み込みをやっていきましょう。
Pillow(PIL)のインストール
画像ファイルを読みこむために画像処理ライブラリのPillow(PIL)をインストールします。Anacondaをインストールしている環境であればすでにインストールされているかもしれません。もしインストールされていなければ、ターミナルからcondaコマンドやpipコマンドでインストールしましょう。
$ conda install pillow
あるいは
$ pip install pillow
NumPyとimageファイル
jupyter notebookを使って次の画像を読み込んでいきます。
apples.jpgを作業ディレクトリに配置します。
各種ライブラリのインポートからはじめます。
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from PIL import Image
NumPy、Matplotlibをインポートします。ここでは先ほどインストールしたpillow(PIL)からImageをインポートします。
先ほどのapples.jpgを読み込みますが、Image.open()を使います。
img = Image.open('apples.jpg')
img
open()にファイル名を指定してイメージファイルを開いています。これを変数imgに渡しています。
実行すると次のように表示されます。
(画像表示の部分は表示サイズの関係で、全体ではなく一部だけ切り取っています)
変数imgの型をtype()で調べてみます。
type(img)
Jpegファイルであるのがわかります。
これをNumPyのasarray()を使って読み込んでいきます。
asarray()はリストやタプルなどの配列のようなオブジェクトから配列を生成します。画像ファイルは縦横にデータが並べられた配列と考えることができます。
img_arr = np.asarray(img)
img_arr.shape
asarray()で読み込んだデータを変数img_arrに代入して、shapeを見てみます。
1066行、1600列の配列データになっています。3はカラーのR、G、Bの3つのデータがあることを示しています。heihtが1066px、widthが1600px、3カラーチャンネルということになります。
このデータの配列をimshow()で表示します。
plt.imshow(img_arr)
画像の変換
この画像をRGBカラーモデルのGの緑を強調した画像に変換してみようと思います。
img_arrをcopy()を使ってコピーします。
img_green = img_arr.copy()
コピーしたものをimg_greenとしておきます。
img_greenは(行データ, 列データ, RGBデータ)の構造になっているのは、上のshapeを使ったことでわかります。
画像部分のデータは全部表示するなら特に切り取ることはありません。RGBデータは0がR(赤)、1がG(緑)、2がB(青)意味します。
ここでは緑系の画像にしようとしているので、RGBの1は操作しないことにします。
すると、img_greenは次のように操作することができます。
img_green[:, :, 0] = 0
img_green[:, :, 2] = 0
どちらもコロンを使って画像データを全て表示する操作になっていますので、データを切り取っていません。RGBのRとBである0、1を指定して0を代入し、赤と青の色味を消しています。
これを再度、imshow()で表示してみます。
plt.imshow(img_green)
リンゴの画像が緑中心のものに変換されました。
以上、画像の色の変換を行ってみました。
最後に
ここでは、PythonのNunPyの配列と画像のデータを扱ってみました。AI、機械学習などでも扱うことになります。
画像ファイルを読みこむために画像処理ライブラリのPillow(PIL)をインストールして使ってみました。
RGBカラーモデルの表現方法についても理解しておきましょう。
ここでは色の変換をしてみましたが、画像サイズや比率、形の変換もすることができます。このあたりは実際に行う時に触れてみようと思います。