AIで扱う画像データについて
画像処理を行う人工知能(AI)モデルを開発する場合、画像データに関する知識がないと何をやっているのか理解できません。Pythonでの取り扱いやコンピューター自体で画像がどのように扱われているかを説明します。理解を深める題材として、CV2(OpenCV)の画像処理を例に挙げます。CV2で読み込んだ画像は、ある変換を加えないと元の画像のように表示できません。その仕組みを考察する過程で画像データに対する理解が深まります。
画像データ理解はAI画像処理に必須です
目次
準備
はじめに
画像データで取り扱うデータには特徴があります。0~255の256個(8ビット)の数字であることです。24ビットカラー画像はRGB(赤、緑、青:色の3原色)それぞれを256x256x256=16,777,216(約1677万色)が表現できます。レコード音源をCD(デジタル音源)に変換したのと似ています。cv2(OpenCV)を使って、その特徴に迫ります。
- 「256」が”3つ”あります
- 登場するのは0~255までの数字です
ディープラーニングで画像データを取り扱う場合、0~255の数値を正規化(0.0~1.0に押し込む)して利用する方が一般的です。
画像の準備
◆カレントディレクトリにデータを準備します。
- 画像データ:「lion.jpg」(任意の画像ファイル)
- MNISTデータ:「train-images-idx3-ubyte.gz」
import glob
sample_image = './lion.jpg' #任意のファイル名に書き換え
glob.glob(sample_image)
['./lion.jpg']
画像データの特徴
ファイルの画像表示
◆見た目で比較にします。
import cv2
import matplotlib.pyplot as plt
im = cv2.imread(sample_image)
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) #BGRをRGBに変換
plt.imshow(im)
plt.show()
(画像表示)
--
5行目でカラーの並び順をBGR→RGBに入れ替えています。
試しに4行目をコメントアウトして実行すると下の画像のようになります。
cv2.COLOR_BGR2RGBで何をが行われているのでしょうか?
◆中身を確認する
im
結果は下記の通り、0~255までの数値が入っていそうです。
[255, 255, 255]が1つのセットのようです。
そのセットがいくつあるのか見ていきます。
--
im.shape:array([[[ 83, 87, 90],
[ 79, 83, 86],
[ 70, 74, 77],
...,
[105, 120, 127],
[115, 128, 136],
[121, 134, 142]],
[[ 83, 87, 90],
[ 80, 84, 87],
[ 72, 76, 79],
...,
[104, 119, 126],
[111, 124, 132],
[115, 128, 136]],
[[ 83, 87, 90],
[ 82, 86, 89],
[ 75, 79, 82],
...,
[103, 118, 125],
[107, 122, 129],
[107, 122, 129]],
...,
[[170, 174, 185],
[172, 176, 187],
[176, 180, 191],
...,
[195, 205, 217],
[197, 207, 219],
[198, 208, 220]],
[[173, 177, 188],
[178, 182, 193],
[176, 180, 191],
...,
[198, 208, 220],
[200, 208, 221],
[200, 208, 221]],
[[176, 180, 191],
[179, 183, 194],
[174, 178, 189],
...,
[200, 210, 222],
[202, 210, 223],
[202, 210, 223]]], dtype=uint8)
この3つはRGBそれぞれを数値にしたものですが、ひと固まりと考えて以降を見ていきます。
細かくデータを見る
◆shapeで確認する。
im.shape
im.shape:(3456, 4608, 3)
--
3次元データで(行, 列, カラー)の順になっています。
3次元目の「3」は上で見た[255,255,255]のセットです。
縦横に3,456×4,608=15,925,248個(ピクセル)、広がっています。
その一つひとつに色が付いているようなイメージができあがります。
◆1つだけ見る。
im[0,0,:] #左上の1ピクセル
array([83, 87, 90], dtype=uint8)
--
0行、0列目の例の3セットを取り出します。
「ペイント」で確認すると、濃いグレーのような色でした。
※「:」は全部と言う意味。im[0,0,0]=>83
10進数(0~255):83 87 90("R"ed “G"reen “B"lue の順)
16進数(00~ff):#53575a(「#」は16進数表記を表すマーク)
※「83」→「53」、「87」→「57」、「90」→「5a」のように対応
16進数(00~ff):#53575a(「#」は16進数表記を表すマーク)
※「83」→「53」、「87」→「57」、「90」→「5a」のように対応
まとめ
「cv2.COLOR_BGR2RGB」を詳しく見る
◆cv2.COLOR_BGR2RGB前後で何が変わったのでしょうか。#もう一度画像情報を取得
im = cv2.imread(sample_image)
before_shape = im.shape
before_color = im[0,0,:]
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) #BGRをRGBに変換
after_shape = im.shape
after_color = im[0,0,:]
#前後で何が変わったかを確認
print('shape:'+str(before_shape)+'→'+str(after_shape))
print('color:'+str(before_color)+'→'+str(after_color))
shape:(3456, 4608, 3)→(3456, 4608, 3)
color:[90 87 83]→[83 87 90]
--
shapeはそのままで変わりません。
3次元目の”カラー3セット”の中身の順番が変わりました。
MatplotlibとCV2のカラーデータの扱いの違いと、cv2.COLOR_BGR2RGB処理内容が分かりました。
おまけ
画像データについて理解できたところで、もう少し考察します。3次元目の「3」はカラーの"3″でした。これを1にするとどうなるでしょうか。
import cv2
import matplotlib.pyplot as plt
im = cv2.imread(sample_image)
ims = im[:,:,0]
plt.imshow(ims, cmap='gray')
plt.show()
print(ims.shape)
以上



