今回も画像を2値化を行う。前回は画像全体で閾値を決めるグローバルな閾値を使ったが、今回は局所的に閾値を決定する適応型を使用する。

適応的には2通りのアルゴリズムがあり、adaptiveThreshold に渡すパラメータ CV_ADAPTIVE_THRESH_MEAN_C または CV_ADAPTIVE_THRESH_GAUSSIAN_C で決定する。

両方とも BlockSize x BlockSize の近傍領域で判定するため、画像全体で最適な閾値がないような場合にはこちらのほうが適していると思われる。

main.cpp を以下のように書き換える。

int g_MeanBlockSize = 0;
int g_MeanOffset = 0;
int g_GaussianBlockSize = 0;
int g_GaussianOffset = 0;

void onTrackbarMean(int, void* pimg_gray)
{
	try {
		cv::Mat img_gray = *(cv::Mat*)pimg_gray;
		cv::Mat img_threshold;
		cv::adaptiveThreshold(img_gray, img_threshold, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, g_MeanBlockSize, g_MeanOffset);
		imshow("threshold_mean", img_threshold);
	}
	catch (...) {
		cv::Mat img_gray = *(cv::Mat*)pimg_gray;
		cv::Mat img(img_gray.size(), CV_8UC3, cv::Scalar(0, 0, 0));
		imshow("threshold_mean", img);
	}
}

void onTrackbarGaussian(int, void* pimg_gray)
{
	try {
		cv::Mat img_gray = *(cv::Mat*)pimg_gray;
		cv::Mat img_threshold;
		cv::adaptiveThreshold(img_gray, img_threshold, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, g_GaussianBlockSize, g_GaussianOffset);
		imshow("threshold_gaussian", img_threshold);
	}
	catch (...) {
		cv::Mat img_gray = *(cv::Mat*)pimg_gray;
		cv::Mat img(img_gray.size(), CV_8UC3, cv::Scalar(0, 0, 0));
		imshow("threshold_gaussian", img);
	}
}

int main(int argc, char* argv[])
{
	// オリジナル画像の読み込み
	cv::Mat img_org = cv::imread("hp-business-card.JPG");
	cv::namedWindow("original");
	imshow("original", img_org);

	// グレースケール
	cv::Mat img_gray;
	cv::cvtColor(img_org, img_gray, CV_BGR2GRAY);
	cv::namedWindow("grayscale");
	imshow("grayscale", img_gray);

	// 画像の適応的閾値処理(MEAN)
	cv::namedWindow("threshold_mean");
	cv::createTrackbar("blockSize", "threshold_mean", &g_MeanBlockSize, 255, onTrackbarMean, &img_gray);
	cv::createTrackbar("offset", "threshold_mean", &g_MeanBlockSize, 255, onTrackbarMean, &img_gray);
	cv::setTrackbarPos("blockSize", "threshold_mean", 41);
	cv::setTrackbarPos("offset", "threshold_mean", 5);

	// 画像の適応的閾値処理(GAUSSIAN)
	cv::namedWindow("threshold_gaussian");
	cv::createTrackbar("blockSize", "threshold_gaussian", &g_GaussianBlockSize, 255, onTrackbarGaussian, &img_gray);
	cv::createTrackbar("offset", "threshold_gaussian", &g_GaussianOffset, 255, onTrackbarGaussian, &img_gray);
	cv::setTrackbarPos("blockSize", "threshold_gaussian", 41);
	cv::setTrackbarPos("offset", "threshold_gaussian", 5);

	cv::waitKey(0);
	cv::destroyAllWindows();
	return 0;
}


実行すると、ダイアログが3つ表示される。これは元画像。
opencv9

こちらは CV_ADAPTIVE_THRESH_MEAN_C。「Harry Potter」も「Graphic Designer」も判定できる。
opencv14

こちらはCV_ADAPTIVE_THRESH_GAUSSIAN_C。こちらも「Graphic Designer」も「Harry Potter」も読むことができる。
opencv15

以上です。