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に押し込む)して利用する方が一般的です。

画像の準備

◆カレントディレクトリにデータを準備します。

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行目でカラーの並び順をBGRRGBに入れ替えています。
試しに4行目をコメントアウトして実行すると下の画像のようになります。
cv2(OpenCV)での正しい画像表示
正しい色のライオン
cv2(OpenCV)での間違った画像表示
変な色のライオン
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
ビットカラーパレットで色を確認
Windowsアクセサリーのペイントで確認
10進数(0~255):83 87 90("R"ed “G"reen “B"lue の順)
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セット”の中身の順番が変わりました。
MatplotlibCV2のカラーデータの扱いの違いと、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)
(画像表示)

(3456, 4608)
--
グレースケールに変換されました。
3次元目の"1"はなくなり、2次元になっています。

※cmap='gray'で2色カラーを白黒指定します
カラー画像をグレースケール(白黒)に変換

『機械学習ライブラリ(初級編)』に戻る>>

以上