图像阈值化的一般目的是从灰度图像中分享目标区域和背景区域,然而仅仅通过设定固定阈值很难达到理想的分割效果。在实际应用中,我们可以通过某个像素的邻域以某种方法确定这个像素应该具有的阈值,进而保证图像中各个像素的阈值会随着周期围邻域块的变化而变化。在灰度图像中,灰度值变化明显的区域往往是物体的轮廓,所以将图像分成一小块一小块的去计算阈值往往会得出图像的轮廓,而固定阈值的方法就不行。
OpenCV中提供了自适应阈值化函数adaptiveThreshold来实现自适应阈值处理、
函数adaptiveThreshold的原型如下:
C++: void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C);
官方说明
int main(int argc, char* argv[])
{
// 图像读取及判断
cv::Mat srcImage = cv::imread("2.jpg");
if (!srcImage.data)
return 1;
// 灰度转换
cv::Mat srcGray;
cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);
cv::imshow("srcGray", srcGray);
cv::Mat dstImage;
// 初始化自适应阈值参数
int blockSize = 4;
int constValue = 5;
const int maxVal = 255;
/* 自适应阈值算法
0:ADAPTIVE_THRESH_MEAN_C
1: ADAPTIVE_THRESH_GAUSSIAN_C
阈值类型
0: THRESH_BINARY
1: THRESH_BINARY_INV */
int adaptiveMethod = 0;
int thresholdType = 1;
// 图像自适应阈值操作
cv::adaptiveThreshold(srcGray, dstImage,maxVal, adaptiveMethod,thresholdType, blockSize,constValue);
cv::imshow("dstImage", dstImage);
cv::waitKey(0);
}
效果图:
参考: