cvtColor(sourceImg, imgGray, CV_BGR2GRAY); //转成灰度
Mat dst=imgGray>150; //大于150为白色
imshow("二值化",dst);
double cv::threshold(
cv::InputArray src, // 输入图像 灰度图cvtColor(src, src, CV_BGR2GRAY);
cv::OutputArray dst, // 输出图像
double thresh, // 阈值
double maxValue, // 向上最大值
int thresholdType // 阈值化操作的类型
);
关于thresholdType
,对应的值和含义如下
使用以上5种类型,实验如下:
可以看出,由于图片各处亮度不同,导致阈值化的效果并不好
自适应阈值化能够根据图像不同区域亮度分布的,改变阈值,具体调用方法如下
void cv::adaptiveThreshold(
cv::InputArray src, // 输入图像
cv::OutputArray dst, // 输出图像
double maxValue, // 向上最大值
int adaptiveMethod, // 自适应方法,平均或高斯
int thresholdType // 阈值化类型
int blockSize, // 块大小
double C // 常量
);
支持两种自适应方法,即adaptiveMethod可为
ADAPTIVE_THRESH_MEAN_C(平均)和ADAPTIVE_THRESH_GAUSSIAN_C(高斯)
在两种情况下,自适应阈值T(x, y)。通过计算每个像素周围bxb大小像素块的加权均值并减去常量C得到。其中,b由blockSize给出,须为奇数3,5,7…;
如果使用平均的方法,则所有像素周围的权值相同;如果使用高斯的方法,则(x,y)周围的像素的权值则根据其到中心点的距离通过高斯方程得到
使用slider调节blockSize效果如下(图片大小为540*581,经测试最合适的blockSize为127)
//----------------------------------【on_Trackbar()函数】-----------------------------
// 描述:响应滑动条的回调函数
//-----------------------------------------------------------------------------------
void on_Trackbar(int, void *)
{
int maxVal = 255;
int blockSize = 2*ValueSlider+3; //blockSize为奇数,3,5,7...
double C = 0;
cv::adaptiveThreshold(chessImg, dstAdpat, maxVal, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, blockSize, C);
//显示效果图
imshow(WINDOW_NAME, dstAdpat);
}
可以直接调用CV_THRESH_OTSU
threshold(srcGray,dstOTSU,0,255, CV_THRESH_OTSU); //thresh由OTSU算法生成