2017年2月15日水曜日

OpenCV で画像をグレースケール化/二値化する

通常、画像は明度・色相・彩度で表現されるが、グレースケールとは明度のみで表現した画像のことである。

cv2.imread で画像データを読み込んだ際、画素値の集合(リスト)を返す。このとき、カラーの場合は、青・緑・赤の色成分の配列、グレースケールの場合は、明るさを示している。
>> img = cv2.imread(画像ファイルへのパス, cv2.IMREAD_COLOR) # カラー画像として読み込む
>> print(img[100, 100]) # (100,100) の画素値を表示
[124 168 162]

>> img = cv2.imread(画像ファイルへのパス, cv2.IMREAD_GRAYSCALE) # グレースケール画像として読み込む
>> print(img[100, 100]) # (100,100) の画素値を表示
161
カラー画像として読み込んだデータをグレースケールに変換する場合は、cv2.cvtColor を用いる。このとき、第2引数に cv2.COLOR_BGR2GRAY を指定する。
なお、cv2.cvtColor は様々な変換処理を行うことができる。詳細については、マニュアルなどを参照のこと。
>> img = cv2.imread(画像ファイルへのパス) # 第2引数を省略した場合は、カラー画像として読み込む
>> img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
>> print(img_gray[100,100])
161
二値化は白または黒のみの画像データのことである。一旦グレースケール化したデータに対して、明度が与えられた閾値以上なら白、以下なら黒にする。
cv2.threshold の第2引数に閾値を与え、閾値以上なら第3引数の値に変更する。
>> print(img_gray[100,100])
161

>> print(img[200, 80])
69

>> _, img_bin = cv2.threshold(img_gray, 128, 255, cv2.THRESH_BINARY) # 128 を閾値にする
>> print(img_bin[100,100])
255

>> print(img_bin[200,80])
0
以下のスクリプトにより、これらの処理を画像で確認する。
# -*- coding: utf-8 -*-
import cv2

IMG_FILE = "(画像ファイルへのパス)"

img = cv2.imread(IMG_FILE)
cv2.imshow("image0", img)
cv2.waitKey()
cv2.destroyAllWindows()

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("image1", img_gray)
cv2.waitKey()
cv2.destroyAllWindows()

_, img_bin = cv2.threshold(img_gray, 128, 255, cv2.THRESH_BINARY)
cv2.imshow("image2", img_bin)
cv2.waitKey()
cv2.destroyAllWindows()

0 件のコメント:

コメントを投稿