多次元配列操作の例(画像処理)

目的

これまでにnumpyモジュールのndarrayオブジェクトを使用した多次元配列の操作方法を学んだ.ここでは,多次元配列の例としてディジタル画像を取り上げ,ディジタル画像に対して様々な処理をすることを通して,多次元配列の操作方法を確認する.

説明

多次元配列の例(ディジタル画像)

OpenCVを使用して読み込んだ静止画像データは多次元配列であることを確認しよう.

6行目でOpenCVを使用して静止画像データを読み込み,7行目で型を表示している.以下の実行結果から,OpenCVを使用して読み込んだ静止画像データはnumpyモジュールのndarrayオブジェクトであることがわかる.7行目で画像データのshapeを出力すると,以下のように表示されることから,解像度が320×240で,BGRの3チャンネルからなるカラー画像であることがわかる.(OpenCVの画像データはRGBの順ではなく,BGRの順で表されている.)また,8行目で要素の型を出力すると,以下のように表示されることから,8ビットの符号なし整数(0から255までの整数)としてBGRの各値が表現されていることがわかる.

配列操作を使用した簡単な画像処理

以上の例より,静止画像データは3次元配列の一例であることがわかった.ここでは,これまでに学んだ配列操作を静止画像データに適用することで,簡単な画像処理をしてみよう.

解像度を縦横半分にする

画像の解像度を縦横半分にし,4分の1の大きさの画像にする処理は以下のように記述できる.

7行目のように記述すると,縦と横方向にstep幅2で画素を間引きした画像データを作ることができる.

上下に反転する

画像を上下に反転するには,以下のようにすればよい.

7行目のように記述すると,縦方向に逆順とした画像データを作ることができる.

グレースケール画像に変換する

Red, Green Blueを同じ強さで光らせたときに,人間が感じる明るさの比は,Blueを1とすると,Redはおよそ3であり,Greenはおよそ6であることが知られている.したがって,BGRの各値からグレースケール画像の輝度Yを求めるには「Y = 0.1 * B + 0.6 * G + 0.3 * R」と計算すればよい.

8行目のように記述すると,カラー画像のBGRの各値から輝度を求めることができる.この計算結果は浮動小数点数となることから,9行目で8ビット符号なし整数型(0から255の整数)に変換している.

画像の一部を取り出す

画像の一部(長方形の領域)を取り出す処理は以下のように書ける.

7行目のように記述すると,縦方向に210画素の位置から229画素の位置まで,横方向に225画素の位置から254画素の位置までの長方形の領域を取り出すことができる.

画像の一部を塗りつぶす

以下のように記述すると,ある色で画像の一部(長方形の領域)を塗りつぶすことができる.

8行目で画像データをコピーし,9行目でコピーした画像の一部の領域のBGR値を[0, 0, 255](赤)にしている.

縦と横を入れ替える

以下のように記述すると,画像の縦と横を入れ替えることができる.

7行目のように記述すると,入力画像の縦と横を入れ替えた画像を作ることができる.

画像を分割する

画像を分割するには,以下のようにすればよい.

8行目のように記述すると,上下に画像を2分割することができる.

画像を結合する

画像を結合するには,以下のようにすればよい.

8,9行目で2枚の画像(この例では同じ画像)を読み込み,10行目で2枚の画像を横方向に結合している.

画像を結合する場合には,画像のチャンネル数は同じでなければならず,横方向に結合する場合には,画像の高さも同じでなければならない.今回の例のように同じ画像を使用しない場合には,以下のようにif文で条件を記述するとよいだろう.

BGR値の最小値・最大値を求める

1枚の画像中にあるBGRの各値の範囲(最小値と最大値)を求めるには,以下のようにすればよい.

8,9行目のように記述すると,BGRの各チャンネルに対する最小値と最大値を求めることができる.2次元配列の場合,キーワード引数axisには0や1を指定した.多次元配列の場合,(0,1)のようにタプルを指定することができ,0番目と1番目の軸に対して処理をしたいときに使用する.

BGR値の平均値・中央値・標準偏差を求める

1枚の画像中でBGRの各値がどのように分布しているかを知りたい場合には,以下のようにすればよい.

8行目から10行目のように記述すると,BGRの各値に対して平均値・中央値・標準偏差を求めることができる.

簡単な図形の画像を作る

例えばフランスの国旗のような簡単な図形からなる画像を作るには,以下のようにすればよい.

6行目から8行目で,解像度とチャンネル数を指定し,9行目で横幅を3で割った数値を求めている.11行目で,解像度とチャンネル数を指定し,8ビット符号なし整数型の空の3次元配列を生成している.11行目で左側の青の色を,12行目で中央の白の色を,13行目で右側の赤の色を設定している.

課題

課題0

カラー静止画像を読み込み,解像度を縦横に1/3にせよ.

課題1

カラー静止画像を読み込み,左右に反転せよ.

課題2

カラー静止画像を読み込み,グレースケール画像に変換し,グレースケール画像をネガポジ反転(明るい画素を暗く,暗い画素を明るく)せよ.

課題3

カラー静止画像を読み込み,画像の一部(長方形の領域)を取り出せ.

課題4

カラー静止画像を読み込み,画像の一部(長方形の領域)を緑色で塗りつぶせ.

課題5

カラー静止画像を読み込み,縦と横を入れ替えよ.

課題6

カラー静止画像を読み込み,4分割(縦に2等分,横に2等分)せよ.

課題7

カラー静止画像を読み込み,入力画像・左右に反転した画像・上下に反転した画像・上下左右に反転した画像を,縦横に結合せよ.

課題8

カラー静止画像を読み込み,BGR値の最小値・最大値・平均値・中央値・標準偏差・分散を求めよ.

課題9

イタリア国旗の画像を作れ.