2020年5月11日月曜日

【OpenCV】画像読み出しとサイズ・画素情報取得、切り抜き、貼り付け、チャンネル操作

 pillowと並んで代表的なpythonの画像処理ライブラリOpenCV。コンピュータビジョン向けに開発されており輪郭抽出や機械学習といった高度な機能が実現できる。
OpenCVによる画像読み出しとサイズ・画素情報取得、切り抜き、貼り付け、チャンネル操作について説明する。


OpenCVを使うには次のようにインポートが必要。
import cv2

例に用いる画像'yamagirl.jpg'(幅400x高さ266ピクセル)は以下を使用(フリー写真素材ぱくたそより)





1. 画像読み出しとサイズ・画素情報取得

 画像読み出しはimreadを用い引数にファイルパスを記述する。書式は以下の通り。

img = cv2.imread(filename[,flags])

 次の例では画像ファイル'yamagirl.jpg'を読み出しオブジェクトimgに代入している。

import cv2

img = cv2.imread('yamagirl.jpg')


 読みだした画像に対してshapeメソッドを適用することで画像の高さ、幅、チャンネル数が取得できる。画像が400x266ピクセルのRGB画像(3チャンネル)のため以下の値が得られる。

import cv2

img = cv2.imread('yamagirl.jpg')
print(img.shape)

実行結果

(266, 400, 3)


 shapeメソッドの戻り値はタプルだが個別の値を別々の変数で受け取ることが可能。

import cv2

img = cv2.imread('yamagirl.jpg')
y, x, channel = img.shape
print(y, x, channel)

実行結果

266 400 3


 sizeメソッドによって画像のピクセル数が取得できる。ピクセル数 = 高さx幅xチャンネル数 となる。

import cv2

img = cv2.imread('yamagirl.jpg')
print(img.size)

実行結果

319200


 任意の位置のピクセルを指定することで画素情報が取得できる。取得される値は各チャンネルの輝度で0~255の整数値となる。BGR(青緑赤)の順となっていることに注意が必要。またピクセルの指定は左上の角を基準(0)として高さ、幅の順となる。
高さ200、幅300の位置の輝度情報を取得。B(青)=70、G(緑)=0、R(赤)=140となる。

import cv2

img = cv2.imread('yamagirl.jpg')
px = img[200, 300]
print(px)

実行結果

[ 70   0 149]


2. 引数flagsの指定

 imreadの第2引数flagsを指定することで様々なカラーモードでの画像読み出しが可能。
代表的なflagは以下。

flag 定義
cv2.IMREAD_COLOR または 1 または 指定なし(デフォルト) アルファチャンネル無しのカラー画像
cv2.IMREAD_GRAYSCALE または 0 グレースケール読み出し
cv2.IMREAD_UNCHANGED または -1 アルファチャンネルを含んだカラー画像

 グレースケールのflag 0を設定した場合。カラー画像がグレースケール変換され読み出される。
なおコードのimshowで別ウィンドウに画像が表示されるが、それだけだとコードが実行終了してしまい画像が表示されない(表示された瞬間に消える)ためwaitKeyによるキー入力待ちとdestroyAllWindowsによるウインドウ消去を付け加えることで画像を表示させている。

import cv2

gray = cv2.imread('yamagirl.jpg', 0)
cv2.imshow('gray', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

実行結果




3. 切り抜きと貼り付け

 元画像の任意の座標範囲を指定することで、指定した範囲の画像を切り抜くことが可能。
元画像の高さ30~119、幅220~349を指定して取得する例

import cv2

img = cv2.imread('yamagirl.jpg')
face = img[30:120, 220:350]
cv2.imshow('face', face)
cv2.waitKey(0)
cv2.destroyAllWindows()

実行結果

 


 画像の範囲を指定し同サイズの別画像を代入することで画像貼り付けができる。
元画像imgの高さ30~119、220~349に上で切り抜いた画像を貼りつける例。

import cv2

img = cv2.imread('yamagirl.jpg')
face = img[30:120, 220:350]
img[30:120, 20:150] = face
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

実行結果




4. チャンネル操作

 インデクシングにより画像オブジェクトの各チャンネルを指定して操作することが可能。BGR画像の場合、チャンネル0がB(青)、チャンネル1がG(緑)、チャンネル2がR(赤)となる。
スライシング([:,:,)で全画素を指定した上でチャンネル1,2を0、つまり緑と赤の輝度を0にし青成分のみの画像に変換する例。

import cv2

img = cv2.imread('yamagirl.jpg')

img[:, :, 1] = 0
img[:, :, 2] = 0

cv2.imshow('blue', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

実行結果




5. リファレンス

OpenCV > Basic Operations on Images

使用したバージョン:Python 3.7.0 / OpenCV 4.0.0

0 件のコメント:

コメントを投稿