#author("2025-04-23T11:03:02+09:00","","") #author("2025-04-23T11:08:16+09:00","","") [[log/20250422/佐藤綺羅]] *2値化処理 [#y27351c6] **cv2.threshold関数 [#wb0a0c9f] 2値化は画像を白黒の2つの色に変換する処理であり、物体の抽出に用いられる。~ OpenCVではcv2.theshold関数を用いることで、画像の2値化処理が行える。 thresholded = cv2.function(入力画像, thresh, maxval, type) 引数は以下の通り。 |入力画像(必須)|処理対象の画像。グレー画像のみに対応。| |thresh(必須)|閾値。| |maxval(必須)|閾値を超えた場合に設定される値。基本は255だが、1にするときもある。| |type(必須)|閾値処理のタイプ。| typeには、以下の値を指定できる。 |cv2.THRESH_BINARY|画素の輝度値が閾値を超える場合は maxval、そうでない場合は 0 に設定。| |cv2.THRESH_BINARY_INV|画素の輝度値が閾値を超える場合は 0、そうでない場合は maxval に設定。| |cv2.THRESH_TRUNC|画素の輝度値が閾値を超える場合は閾値に、そうでない場合はそのままの値に設定。| |cv2.THRESH_TOZERO|画素の輝度値が閾値を超える場合はそのままの値に、そうでない場合は 0 に設定。| |cv2.THRESH_TOZERO_INV|画素の輝度値が閾値を超える場合は 0 に、そうでない場合はそのままの値に設定。| |cv2.THRESH_OTSU|大津の二値化。画像のヒストグラム解析を用いて自動的に閾値を決定する手法。| |cv2.THRESH_TRIANGLE|トライアングル アルゴリズムにより自動的に閾値を決定する手法。| 戻り値は以下の2つの要素からなるタプル。 |retval|実際に適用された閾値。処理中にcv2.THRESH_OTSUを使って自動的に閾値が計算された場合、この値に計算された閾値が格納される。通常の手動の場合は、引数で指定した閾値そのものがretvalとして返る。| |thresh|閾値処理が適用された結果の画像。ピクセルの値が閾値を超えると、指定したmaxvalに設定され、それ以下の場合は0に設定された画像。| 以下にプログラムの実行例を示す。 取り込んだ画像~ &attachref(neko.jpeg); コード #code(python){{ #!/usr/bin/python import cv2 img = cv2.imread("neko.jpeg") gimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, g2img = cv2.threshold(gimg, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU) _, g2img = cv2.threshold(gimg, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) cv2.imshow("neko",g2img) cv2.waitKey(0) }} 実行結果~ &attachref(neko_threshold.png); _, g2img = ...と記述することで、戻り値の第一要素retvalを参照できなくすることが可能。~ こうすることでg2imgを関数に代入しても、画像情報に直接アクセスできる。~ また、typeはcv2.THRESH_BINARY+cv2.THRESH_OTSUのように複数指定可能。~ また、typeはcv2.THRESH_BINARY + cv2.THRESH_OTSUのように複数指定可能。~ この場合は、自動的に閾値を決定した後、画素の輝度値が閾値を超える場合は maxval、そうでない場合は 0 に設定する処理となる。~