OpenCV threshold の使い方

はじめに

 OpenCV のthreshold を使った二値化処理ついて調べたことをまとめた。
adaptiveThreshold については別で。

とりあえず関数を試してみたい方

実験用プログラム OpenCV_test の GitHubリポジトリ
URL
https://github.com/iryachi/OpenCV_test
実行ファイルだけ
https://github.com/iryachi/OpenCV_test/releases
使い方
https://iryachi.stars.ne.jp/opencv_test_imple/

threshold 関数について

double cv::threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type );

引数

srcInputArray入力画像グレースケールの画像 ・1チャンネル, 8bit整数 ・1チャンネル, 32bit浮動小数点
dstOutputArray出力画像二値化処理後の画像 入力画像と同じフォーマット
threshdouble閾値8bit 整数 : 0 – 255 (UINT8_MAX) 32bit 浮動小数点 : FLT_MIN – FLT_MAX
maxvaldouble閾値を超えたピクセルに代入する値8bit整数 の場合は 0 – 255 (UINT8_MAX) 32bit 浮動小数点 : FLT_MIN – FLT_MAX THRESH_BINARY, THRESH_BINARY_INV の時に利用
typeint二値化のパラメータ後述

返り値 double

 THRESH_OTSU、THRESH_TRIANGLE を使った時に算出された閾値。

二値化のパラメータ type について

THRESH_BINARY閾値を超えるピクセルは maxVal 、それ以外のピクセルは 0。
THRESH_BINARY_INV閾値を超えるピクセルは 0 、それ以外のピクセルは maxVal。
THRESH_TRUNC閾値を超えるピクセルは threshold に、それ以外のピクセルは変更なし。
THRESH_TOZERO閾値を超えるピクセルは変更なし、それ以外のピクセルは 0 。
THRESH_TOZERO_INV閾値を超えるピクセルは 0、それ以外のピクセルは変更なし。
THRESH_MASK設定不可。
THRESH_OTSU大津の方法を用いて自動で閾値を設定。
閾値を超えるピクセルは maxVal。それ以外のピクセルは 0。
8bit画像にしか使えない。
THRESH_TRIANGLEトライアングル法を用いて自動で閾値を設定。
閾値を超えるピクセルは maxVal。それ以外のピクセルは 0。8bit画像にしか使えない。

パラメータの違いによる処理結果例

元画像
THRESH_BINARY, threshold 128, maxval 255
THRESH_BINARY, threshold 128, maxval 128
THRESH_BINARY, threshold 64, maxval 255
THRESH_BINARY_INV, threshold 128, maxval 255
THRESH_BINARY_INV, threshold 128, maxval 128
THRESH_BINARY_INV, threshold 64, maxval 255
THRESH_TRUNC, threshold 128
THRESH_TOZERO, threshold 128
THRESH_TOZERO_INV, threshold 128

おわりに

二値化のパラメータ設定は結構難しい。輝度の変化とかですぐに結果が変わってしまう。 THRESH_OTSU で行けるなら OTSU でやったほうが安定すると思う。