C++版 OpenCVの基本

2値化する前にグレースケール化する

2値化は白黒の画像にすること、グレースケール化は白黒とその間の灰色だけの彩度0の画像にすることを言います。OpenCVの2値化関数は入力にグレースケール画像を受け付けるため、カラー画像を2値化するなら、最初にグレースケール化を行う必要があります。
Point:カラー画像→グレースケール画像→2値画像

グレースケール化する

cvtColor関数でグレースケール化できます。第一引数にカラー画像のMatを、第二引数にグレースケール画像を入れるためのMatを、第三引数にCV_BGR2GRAYを指定します。

Mat input_img = imread("sample.png", IMREAD_UNCHANGED);
Mat gray_img; //グレースケール画像を入れておくためのMat
cvtColor(input_img, gray_img, CV_BGR2GRAY); //グレースケールに変換

 

2値化する

2値化はthreshold関数によって行います。何度も言いますが、この2値化関数は入力にグレースケール画像を必要とします。第一引数にグレースケール画像のMatを、第二引数に2値画像を入れるためのMatを指定します。さらに、どれくらいの明るさ以上で白にするかという指標を閾値として0~255で第三引数に与えます。この閾値は自動で設定するようにもできます。

Mat input_img = imread("sample.png", IMREAD_UNCHANGED);
Mat gray_img; //グレースケール画像を入れておくためのMat
Mat bin_img; //2値画像を入れておくためのMat
cvtColor(input_img, gray_img, CV_BGR2GRAY); //グレースケールに変換
threshold(gray_img,bin_img,160,255,THRESH_BINARY); //閾値160で2値画像に変換
threshold(gray_img, bin_img, 0, 255, THRESH_BINARY | THRESH_OTSU); //閾値を自動で設定