OpenCV

画像処理 「OpenCV 4」座標やピクセルへの書き込み・読み込み

画像処理をする際に基本となる座標系や、ピクセルへの操作について確認します。

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]のような縦横の行列が返ります。
 読み込み、 書き込み時もチャンネルの指定はできず、黒の値のみを取得、設定します。