相对于一般得阈值化操作,当图像中出现较大得明暗差异时,自适应阈值化非常有效。
效果:
函数原型:
CV_EXPORTS_W void adaptiveThreshold( InputArray src,
OutputArray dst,
double maxValue,
int adaptiveMethod,
int thresholdType,
int blockSize,
double C );
src:8位单通道图像
dst:目标图像的大小和类型与src相同
maxValue:赋给满足条件的像素的非零值
adaptiveMethod:自适应阈值滤波算法选择cv::ADAPTIVE_THRESH_GAUSSIAN_C或者cv::ADAPTIVE_THRESH_MEAN_C
thresholdType:阈值设定类型cv::THRESH_BINARY或者cv::THRESH_BINARY_INV
blockSize:用于计算阈值的像素邻域的大小 如:3,5,7等等。
C:通常情况下,它是正数,但也可能是零或负数
代码:
void example()
{
cv::Mat input = cv::imread("d:\\desktop\\picture\\test.jpg"), output, str1;
cv::namedWindow("example");
int maxval = 0, adaptiveMethod = 0, thresholdType = 0 , blockSize = 1, C = -100, blockSize_test = 1, c_test = 100;
cv::createTrackbar("maxval", "example", &maxval, 255);
cv::createTrackbar("adaptiveMethod", "example", &adaptiveMethod, 1);
cv::createTrackbar("thresholdType", "example", &thresholdType, 1);
cv::createTrackbar("blockSize", "example", &blockSize_test, 255);
cv::createTrackbar("C", "example", &c_test, 200);
cv::cvtColor(input, str1, CV_BGR2GRAY);
for(;;)
{
blockSize = blockSize_test;
if(blockSize_test < 1) //使blockSize_test大于1
blockSize = 1;
C = c_test - 100; //小于100为负数 ,因cv::createTrackbar不能设置最小值
cv::adaptiveThreshold(str1, output, maxval, adaptiveMethod, thresholdType, blockSize*2+1, C);
cv::imshow("example", output);
if(cv::waitKey(100) == 27)
break;
}
}