#はじめに
OpenCV(C++)で二値化を何気なく行っていたが,今更自分の理解が間違っていたことに気づいた.
そこで,もしかしたら他の人も勘違いしているのかもと思って,参考になればなと思う.
#Threshold関数
二値化を行うのに用いるThreshold関数.
ドキュメントにはこう書かれている.
double threshold(const Mat& src, Mat& dst, double thresh, double maxVal, int thresholdType)
配列の要素に対して,ある定数での閾値処理を行います.
パラメタ:
src – 入力配列(シングルチャンネル,8ビット,あるいは32ビット浮動小数点型).
dst – src と同じサイズ,同じタイプの出力配列.
thresh – 閾値.
maxVal – 閾値処理の種類が THRESH_BINARY や THRESH_BINARY_INV の場合に利用される,最大値の値.
thresholdType – 閾値処理の種類.
公式ドキュメント: Threshold関数
ここで,私はthreshの値〜maxValの値までの範囲を抽出すると思っていた.
つまり,下記のように書くと120〜140の間の部分のみが抽出ができると思っていた.
double threshold(const Mat& src, Mat& dst, double 120, double 140, THRESH_BINARY)
だが,実際は,120〜255の間の画素を抽出し,抽出した画素を140の明るさで画像を生成,dstに入れ込む,というものであった.
指定範囲(上記の例の場合,120〜140)だけを2値化したい
120〜140の部分を抽出する場合の関数を作ってみた.
Mat Binarization(Mat input, int low, int high){
Mat thresh_1, thresh_2, output;
threshold(input, thresh_1, low, 255, CV_THRESH_BINARY); // binalized
threshold(input, thresh_2, high, 255, CV_THRESH_BINARY_INV); // binalized
bitwise_and(thresh_1, thresh_2, output); // and演算
return output;
}
- 引数
- input:入力画像(グレースケール化された画像)
- low:低閾値(上記の例の場合,120)
- high:高閾値(上記の例の場合,140)
- 返り値
- output:(二値化されたMat型の画像)
終わりに
いかがでしたか.
自分のような勘違いをしている人は少ないかもしれませんが,少しでもお役に立てればと思います.
また,何か間違いがあれば,コメントなどでお知らせいただければ幸いです.