今回はOpen CVを使用して画像を読み込みむ方法を調べました。また画像処理をするうえでよく行われる、読み込んだ画像をグレイスケール化する方法についても調べました。
Contents
画像の読み込みと表示
cv2.imreadによる読込
画像の読み込みには次の関数を使用します。
1 |
cv2.imread(filename , flags=cv2.IMREAD_COLOR) |
読み込める画像形式はバージョン等によって異なりますが、以下のような形式を読み込めます。
- .bmp
- .jpeg
- .png
- .tiff
- .pbm
引数の filename には読み込む画像フォイルの名前をテキスト形式で指定ます。
デフォルト引数の flagsには画像を読み込む際のオプションを指定することができます。
デフォルトの cv2.IMREAD_COLOR は画像を BGR の3チャンネルカラー画像として読み込みます。flags にcv2.IMREAD_GRAYSCALE を指定すると画像をグレイ画像として取り込むこともできます。
Cv2.imreadの返り値として画像配列(ndarray形式)が返されます。
画像の表示
画像を読み込み表示するプログラムは次のようになります。
1 2 3 4 5 6 7 8 9 10 |
import cv2 #画像の取り込み src = cv2.imread('img1.jpg') #画像の表示 cv2.imshow('src', src) #キー入力があるまで待機 cv2.waitKey(0) |
ここではcv2.imshow及びcv2.waitKey を用いて画像を表示しています。
1 |
cv2.imshow(winname, mat) |
Cv2.imshowによって画像を表示したウィンドウを生成します。
- 引数の winname に生成するウィンドウの名前を文字列で指定
- 引数の mat に画像配列(ndarray)を指定
Cv2.imshowによって画像が表示されますがこのままではすぐに画像が消えてしまいますので、
次の cv2.waitkey をすぐ後に実行します。
1 |
cv2.waitkey(delay=0) |
Cv2.waitkey はキーが押されるまたはデフォルト引数 delay msec の間処理を中断し、待機します。
- デフォルト引数の delay で指定した時間(msec)待機しますが、0を指定した場合にはキーが入力されるまでの間無制限に待ちます。
画像の構造
Cv2.imreadによって3チャンネルカラー画像として読み込んだ画像配列は3次元構造になっています。
1 2 3 4 5 6 7 |
import cv2 src = cv2.imread('img1.jpg') print(src.shape) => (533, 800, 3) |
1次元目は画像のY方向(行方向)、2次元目は画像のX方向(列方向)、3次元目に画像のカラーチャンネルとなっています。
Open CV ではカラーチャンネルの順番が青、緑、赤の BGR となっています。
これを実際に確かめるプログラムを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import cv2 src = cv2.imread('img1.jpg') srcR = src.copy() srcG = src.copy() srcB = src.copy() srcB[:,:,1:3] = 0 srcG[:,:,0:3:2] = 0 srcR[:,:,0:2] = 0 imH1 = cv2.vconcat([src, srcB]) imH2 = cv2.vconcat([srcG, srcR]) showIm = cv2.hconcat([imH1, imH2]) cv2.imshow('BGR', showIm) cv2.waitKey(0) |
実行結果が次のようになります。
画像の左上が元画像、右上が画像配列3次元目の第1要素以外を0にした画像、左下が3次元目の第2要素以外を0にした画像、右下が第3要素以外を0にした画像になっています。
画像のグレイスケール化
3チャンネルカラー画像では画像平面1枚に対して平面3枚分のデータを持っています。そのため画像の処理を行う際に、処理データの量が大きくなり、処理に時間がかかってしまいます。
そのため、画像処理をする際には3色を適当な割合で混ぜ合わせ、一色の画像に変換するグレースケール化が行われることがあります。
Cv2.cvtColorによる方法
1 |
Cv2.cvtColor(src, code, [dst], [dstCn]) |
cvtColor を使用することで画像配列の色空間を別の色空間へ変換することができます。
- 引数 src に元となる画像配列を指定
- 引数 code に変換する方法を指定
- デフォルト引数 det に変換後の画像を入れる変数を指定する。これは引数として指定する代わりに、返り値を代入する方法でもよい。
- デフォルト引数 dstCn には変換後画像の色チャンネルを指定
cvtColorを用いた場合の各カラーチャンネルとグレイ値の関係式を下記に示します。
R, G, B はそれぞれのカラーチャンネルの値、 Gray が変換されたグレイ値です。
1 2 3 4 5 6 7 8 9 |
import cv2 src = cv2.imread('img1.jpg') #画像をBGR画像からグレイスケールに変換 dst = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) cv2.imshow('dst', dst1) cv2.waitKey(0) |
cv2.imreadによる方法
上記でも少し触れましたが、cv2..imread のデフォルト引数にcv2.IMREAD_GRAYSCALEを指定することで画像をグレイスケールとして取り込むことができます。
Open CVのドキュメントを読むと、cv2.imread によるグレースケール化は各コーデックによって異なるため、cv2.cvtColorによるグレースケール化とは異なる値になるそうです。
1 2 3 4 5 6 7 |
import cv2 #画像をグレイスケール化して取り込み src = cv2.imread('img1.jpg', cv2.IMREAD_GRAYSCALE) cv2.imshow('src', src) cv2.waitKey(0) |
自作関数による方法
画像配列はnumpyのndarrayで表現されていますので、カラー画像をグレースケール化する関数を自作することによって、様々なグレイスケール化を実現することができます。
下記に変換関数の例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import cv2 import numpy as np #自作の変換関数 def RGB2GrayConverter(src,coefR = 1/3, coefG = 1/3, coefB = 1/3): dst = np.zeros(src.shape[:2], dtype=np.uint8) for y in range(src.shape[0]): for x in range(src.shape[1]): dst[y][x] = coefB * src[y][x][0] + coefG * src[y][x][1] + coefR * src[y][x][2] return dst #処理メイン src = cv2.imread('img1.jpg') #色変換 dst = RGB2GrayConverter(src) cv2.imshow('dst1', dst1) cv2.waitKey(0) |
今回はOpen CVによつ画像の取り込みと、画像のグレイスケール化の方法について調べました。