1.背景
ディープラーニングを用いて顔を認識するプログラムを作成していた際に,顔だけが映った画像を用意しなければならなかった.手法としては,人物が映った画像から,顔を検知し,その部分を切り取った.その際,OpenCVのimreadメソッドで返される配列を利用して,切り取った.この記事では,imreadで返される配列について解説する.
2.imreadとは
image = imread('sample.jpg')のように,引数に読み込む画像を指定することで,ファイルから画像を読み込むことができる関数である.この際,imageには,imreadによってsample.jpgの各画素の画素値(RGB値)が格納されている.
実際に,以下のようなプログラムを実行して,確認してみる.
import cv2
#画像を読み込む
image = cv2.imread('sample.jpg')
#imreadで返された配列を出力
print(image)
#読み込んだ画像を表示する
cv2.imshow('img',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
出力は以下のようになる.
このように,3次元配列が出力されていることがわかる.この配列をA×B×3次元配列とする.Aは画素の行数であり,Bは画素の列数である(読み込む画像のサイズによって,行列のサイズは変わるため変数A,Bとした).3は,RGBの輝度である.
上の画像において,輝度が縦に大量に並んでいるが,これは
[[[0行0列目の輝度]~[0行B列目の輝度]]~[[A行0列目の輝度]~[A行B列目の輝度]]]の順に並んでいる.(画像において0行0列目は,左上)
よって,imreadで返される配列とは,画素の輝度を行列の順に格納したものである.
#3. 余談(画像をどう切り取るか)
1章の背景でも,説明したように,imreadで返される配列を利用して顔画像を切り取った.まず,検出した顔画像の左上の位置と,右下の位置を取得する.そして,imreadで返された配列の,顔画像の部分(顔画像の左上の行列から,右下の行列までの区分行列の輝度)だけを取り出すことで,切り取ることができた.詳細は,別の記事で説明しようと思う.