#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 に設定する処理となる。~

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS