OpenCV_二値化 ( threshold )

threshold 関数を用いる。( グローバル閾値 )
シングルチャンネルの配列に対して、ある定数での閾値処理を行う。
閾値より大きいと 1 に、 小さいと 0 に設定して二値画像を作成する。
二値画像生成やノイズ除去などに利用される場合が多い。

 

adaptiveThreshold 関数というのもある。 ( ローカル ( 適応型 ) 閾値 )
threshold画像全体に対して 1 つだけの閾値を決めて処理するが、
adaptiveThreshold は画像のピクセルに応じて異なる閾値を決める。

 

 

 threshold の引数

  1. Mat src
    入力配列。シングルチャンネル、8 ビット または 32 ビット浮動小数型。
  2. Mat dst
    出力配列。src と同じサイズ、同じタイプ。
  3. double thresh
    閾値
  4. double maxVal
    閾値処理の種類 ( thresholdType ) が
    THRESH_BINARY や THRESH_BINARY_INV の場合に利用される。
    最大濃度の値一般的には 255 ?
  5. int thresholdType
    閾値処理の種類自分の環境では先頭に CV_ をつける必要あった。
    • THRESH_BINARY
      閾値を超えるピクセルは maxValに、それ以外は 0 。
    • THRESH_BINARY_INV
      閾値を超えるピクセルは 0 に、それ以外は maxVal 。
      ( 1 と 0 が逆転する )
    • THRESH_TRUNC
      閾値を超えるピクセルは thresh に、それ以外は maxVal 。
    • THRESH_TOZERO
      閾値を超えるピクセルは変更されない。それ以外は 0 。
    • THRESH_TOZERO_INV
      閾値を超えるピクセルは 0 に、それ以外は変更されない。
    特殊な値 THRESH_OTSU を上記の種類と組み合わせて使うこともできる。
    この場合、大津アルゴリズムを用いて最適な閾値を決定し、
    この閾値を引数 thresh で指定された値の代わりに利用する。
    thresh の値は設定しても無視される。一般的には 0 を設定する。

 

f:id:koshinRan:20171024002442p:plain

ex ) ソース

cv::Mat img = cv::imread("./001img.jpg", CV_LOAD_IMAGE_GRAYSCALE);

cv::Mat binary;
//大津法
cv::threshold(img, binary, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
//手動
//cv::threshold(img, binary, 140, 255, CV_THRESH_BINARY);

cv::imshow("b", binary);

 

 

こちらから。
http://opencv.jp/opencv-2svn/cpp/miscellaneous_image_transformations.html#cv-threshold
http://ishidate.my.coocan.jp/opencv_3/opencv_3.htm
https://bi.biopapyrus.jp/ia/opencv/threshold.html

 

以上。
二値化の目的によって手法変える。