OpenCV Reference

【OpenCV-Python】threshold(二値化、大津の二値化)

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()

実行結果

OpenCV Python threshold 二値化

 

大津の二値化に関しては、テストパターンだと、あまり効果を感じないため、自然画で処理した例を示します。

 

大津の二値化のサンプルプログラム

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 Python threshold 二値化

参照ページ

OpenCV: Miscellaneous Image Transformations
OpenCV: Miscellaneous Image Transformations
OpenCV: Image Thresholding
二値化
二値化【Binarization】では画像の輝度値が指定した値(しきい値【Threshold】)以上の場合は白、値未満の場合は黒にする処理を行います。 → 二値化処理前 二値化処理後 二値化処理では上図のように、しきい値付近に輝度値の変動が...
判別分析法(大津の二値化)
判別分析法【discriminant analysis method】は大津の二値化とも言われ、分離度(separation metrics) という値が最大となるしきい値を求め、自動的に二値化を行う手法です。 分離度はクラス間分散(bet...

コメント

タイトルとURLをコピーしました