threshold関数でさまざまなしきい値処理

#contents

*double threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type ); [#p8f4a53c]

-typeで指定された方法によりthresholdでしきい値処理をする

**引数 [#xefbc6fd]
-src:Mat型の画像。
-dst:Mat型の出力画像。
-thresh:double型のしきい値
-maxval:double型の明度値
-type:int型のしきい値処理方法。実際はcv::ThresholdTypesを指定する

**返り値 [#kf3e4949]

-double型のしきい値

*解説 [#o505e5c1]
-doubleのしきい値は、通常パラメータのthreshとして渡した値が返ってくる
--THRESH_OTSUかTHRESH_TRIANGLEを指定した時だけ、推定されたしきい値が返ってくる
-typeでさまざまなしきい値処理をできる
--THRESH_BINARY(0) 通常のしきい値処理
--THRESH_BINARY_INV(1) 通常のしきい値処理の逆(high→0、low→max_value)
--THRESH_TRUNC(2) しきい値以上の値をしきい値に丸める
--THRESH_TOZERO(3) しきい値以下を0にする
--THRESH_TOZERO_INV(4) しきい値以上の値を0に丸める
--THRESH_OTSU(8) しきい値をOTSUの方式(判別分析法)で求める
--THRESH_TRIANGLE(16):TBW。要OpenCV3.0以降
--THRESH_MASK(7):内部で、使用されるenumで、パラメータとして指定することはできない
-しきい値より大きいかがポイント.しきい値はlowにカウントされる
-画像のタイプはfloat型でも可なので,しきい値もdoubleである
-THRESH_OTSUかTHRESH_TRIANGLEを指定した場合は、グレースケールシングルチャンネルのみ
-それ以外の場合は8U、16Sか32F。unsigned char、signed short、floatしかサポートしない

*サンプルコード [#r557db3f]
#geshi(c++){{
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

const char filename[]   = "path/to/opencv/samples/data/pic6.png";
const char windowName[] = "Threshold";
const double kThreshold = 100;
const double kHigh      = 255;

int main(int argc, char**argv)
{
	using namespace cv;

	Mat input = imread(filename, IMREAD_GRAYSCALE);
	namedWindow(windowName);
	imshow(windowName, input);
	waitKey(0);

	Mat result;

	// try various thresholding type
	threshold(input, result, kThreshold, kHigh, THRESH_BINARY);     imshow(windowName,result);	waitKey(0);
	threshold(input, result, kThreshold, kHigh, THRESH_BINARY_INV); imshow(windowName,result);	waitKey(0);
	threshold(input, result, kThreshold, kHigh, THRESH_TRUNC);      imshow(windowName,result);	waitKey(0);
	threshold(input, result, kThreshold, kHigh, THRESH_TOZERO);     imshow(windowName,result);	waitKey(0);
	threshold(input, result, kThreshold, kHigh, THRESH_TOZERO_INV); imshow(windowName,result);	waitKey(0);

	double estimatedTh = 0.f;
	// try automatic threshold
	// try OTSU method
	estimatedTh = threshold(input, result, 0, kHigh, THRESH_BINARY+THRESH_OTSU);
	std::cout << "OTSU threshold    :" << estimatedTh << std::endl;	imshow(windowName,result);	waitKey(0);
	// try OTSU method
	estimatedTh = threshold(input, result, 0, kHigh, THRESH_BINARY+THRESH_TRIANGLE);
	std::cout << "TRIANGLE threshold:" << estimatedTh << std::endl;	imshow(windowName,result);	waitKey(0);

	return 0;
}
}}
*実行結果 [#e56beece]
-各種しきい値処理の結果
-固定しきい値は100でしきい値処理。maxvalは255(白)にした各種結果
--通常のしきい値処理(THRESH_BINARY)
#ref(result0000.png)
--通常のしきい値処理の反転(THRESH_BINARY_INV)
#ref(result0001.png)
--しきい値以上をしきい値に丸め込む(THRESH_TRUNC)
#ref(result0002.png)
--しきい値以下を0にする(THRESH_TOZERO)
#ref(result0003.png)
--しきい値以下を0にする(THRESH_TOZERO_INV)
#ref(result0004.png)
--Otsuの手法(判別分析法)
--しきい値は85
#ref(result0005.png)
--TRIANGLE
--しきい値は126
#ref(result0006.png)

*実体ファイル [#ga00de3c]
-OpenCV 3.0系列
--modules/imgproc/include/opencv2/imgproc.hpp
--modules/imgproc/src/thresh.cpp
-OpenCV 2.4系列
--modules/imgproc/include/opencv2/imgproc.hpp
--modules/imgproc/src/thresh.cpp

ジャンル[[:OpenCV]][[:OpenCV 2.4]][[:OpenCV 3.0]][[:OpenCV 3.1]]準拠

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