OpenCVで画像の二値化、大津の二値化を行うには、threshold()関数を用います。
二値化処理は、欠陥検査などにおいて、ノイズ除去などのフィルタを行った後、二値化処理を行い、面積や形状、位置などから、OK/NGの判定を行う場合などに用いられます。
二値化処理の構文
threshold( src, thresh, maxval, type[, dst] ) -> retval, dst
引数
src | 二値化を行う画像データを指定します。 複数チャンネルの8bit、もしくは32bitのfloatのデータです。 大津の二値化の場合は8bit1ch(グレースケール)に限定されます。 |
thresh | 二値化のしきい値を指定します。 THRESH_OTSUのときは無視されます。 |
maxval | 二値化処理後の値を指定します。通常は255を指定 THRESH_BINARY, THRESH_BINARY_INV, THRESH_OTSU のとき有効 |
type | 二値化処理方法を指定します。(下記参照) |
typeの設定
cv2.THRESH_BINARY | 輝度値がthreshより大きい値をmaxval、それ以外を0にします。 |
cv2.THRESH_BINARY_INV | 輝度値がthreshより大きい値を0、それ以外をmaxvalにします。 |
cv2.THRESH_TRUNC | 輝度値がthreshより大きい値をthresh、それ以外はそのままにします。 |
cv2.THRESH_TOZERO | 輝度値がthreshより大きい値はそのまま、それ以外を0にします。 |
cv2.THRESH_TOZERO_INV | 輝度値がthreshより大きい値を0、それ以外はそのままにします。 |
cv2.THRESH_OTSU | 大津の二値化により、しきい値を求め、 求めたしきい値より大きい値をmaxval、それ以外を0にします。 |
戻り値
retval | 二値化に用いたしきい値。 主に大津の二値化の場合のしきい値確認に用います。 |
dst | 二値化された画像データ |
サンプルプログラム
二値化処理のサンプルプログラムを以下に示します。
import numpy as np
import cv2
def create_test_pattern():
# テストパターンの作成
increase = np.linspace(0, 255, 128, dtype = np.uint8)
decrease = np.linspace(255, 0, 128, dtype = np.uint8)
line = np.concatenate([increase, decrease, increase, decrease])
img = np.tile(line, (128, 1))
return img
# テストパターンの作成
src = create_test_pattern()
# 二値化
ret,thresh1 = cv2.threshold(src,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(src,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(src,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(src,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(src,127,255,cv2.THRESH_TOZERO_INV)
ret,thresh6 = cv2.threshold(src,127,255,cv2.THRESH_OTSU)
# 二値化処理後の画像表示
cv2.imshow("Src Image", src)
cv2.imshow("THRESH_BINARY", thresh1)
cv2.imshow("THRESH_BINARY_INV", thresh2)
cv2.imshow("THRESH_TRUNC", thresh3)
cv2.imshow("THRESH_TOZERO", thresh4)
cv2.imshow("THRESH_TOZERO_INV", thresh5)
cv2.imshow("THRESH_OTSU", thresh6)
cv2.waitKey()
実行結果
大津の二値化に関しては、テストパターンだと、あまり効果を感じないため、自然画で処理した例を示します。
大津の二値化のサンプルプログラム
import cv2
src = cv2.imread("Cameraman.bmp", cv2.IMREAD_GRAYSCALE)
# 大津の二値化
ret,thresh = cv2.threshold(src,0,255,cv2.THRESH_OTSU)
# 二値化処理後の画像表示
cv2.imshow("Src Image", src)
cv2.imshow("THRESH_OTSU", thresh)
cv2.waitKey()
実行結果
参照ページ
OpenCV: Miscellaneous Image Transformations
OpenCV: Miscellaneous Image Transformations
OpenCV: Image Thresholding
二値化
二値化【Binarization】では画像の輝度値が指定した値(しきい値【Threshold】)以上の場合は白、値未満の場合は黒にする処理を行います。 → 二値化処理前 二値化処理後 二値化処理では上図のように、しきい値付近に輝度値の変動が...
判別分析法(大津の二値化)
判別分析法【discriminant analysis method】は大津の二値化とも言われ、分離度(separation metrics) という値が最大となるしきい値を求め、自動的に二値化を行う手法です。 分離度はクラス間分散(bet...
コメント