画像処理をする際に基本となる座標系や、ピクセルへの操作について確認します。
OpenCVでは左上のピクセルを0,0とするゼロからはじまるインデックスです。
また Pythonでは 、画像はNumPy 配列で扱われます。
(NumPyについてはまた詳細の記事を書きます。)
カラー画像の読み込み
画像は以下のようにして読み込みます。この時、 青色のチャンネル、緑のチャンネル、赤チャンネルの順で読み込みます。(頭文字をとって、BGRと呼びます)
RGBとは並びが異なるため、少し混乱しますね。
なぜRGBではなく、BGRか。これは、歴史的背景というやつで、OpenCVの初期の開発時に、BGRがカメラメーカーなどに人気で選択されたことに起因しています。また後でRBGとして扱う方法を紹介します。
画像の読み込み
img = cv2.imread('image.png')
読み込んだ画像を表示
何かキーを押すと、プログラムを続行します。
cv2.imshow("window title", img)
カラー画像への詳細なアクセス
読み込まれた画像は、shapeで、行数、列数、 (イメージが色の場合) チャネルの数が取得できます。
dim = img.shape
shapeの要素をそれぞれをかけた値はsizeで取り出せます。
img_size = img.size
ピクセルを読み込む
(b, g, r) = img[10, 42] # 行列 x=42,y=10
また、特定のチャンネルへのアクセスもできます。例えば緑へアクセスしたい場合は以下のようにします。
g = img[10, 42, 1] # 行列 x=42,y=10 チャンネルは b->0, g->1, r->2
ピクセルへ書き込む
img[10, 42] = (255, 0, 0) #青色が書き込まれる(BGRの並び)
グレースケール画像について
読み込み時に、引数でグレースケールであることを明示します。
gray_img = cv2.imread('gray_image.png', cv2.IMREAD_GRAYSCALE)
※shapeはチャンネルは返されず[50,60]のような縦横の行列が返ります。
読み込み、 書き込み時もチャンネルの指定はできず、黒の値のみを取得、設定します。