什么是二值化
所谓图像二值化,就是将256个亮度等级的灰度图像,通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。
由于我们用摄像头拍到的图像为灰度图像,若直接处理会加大很多不必要的工作量,而将图像二值化,则可以使目标图像变得简单且数据量小,同时又不丢失图像中的重要信息。由此可见,在图像处理中,二值化步骤显得尤为重要。
我们知道,二值化的步骤无非是将获得的图像数据中大于阈值的像素点用255表示,而小于阈值的像素点用0表示。
那么如何选择二值化所需的阈值,就成为了非常重要的一个步骤。
常见的求阈值算法
OSTU大津法
概念及原理
OTSU算法又称为最大类间方差法。这是我们很常见的一种求阈值的方法,它的思路就是通过统计整个图像的直方图特性来实现全局阈值T的自动选取。
该算法进行前先设一个i作为分类阈值,通过归一化的直方图,统计图像中各个灰度级的像素占整幅图像的比例w0,并统计前景像素和背景像素的平均灰度u0和u1,和背景像素所占比例w1;通过公式g = w0w1(u0-u1) (u0-u1)计算前景像素和背景像素的方差 ,每进行完一次循环i值加一,直道i=256时停止循环,并将最大的g值作为图像阈值。
大津法二值化的代码实现在网上比较多,这里不做详细介绍。
iteration迭代法
概念及原理
迭代法也叫最小概率误判法,它使用逐次逼近的思想,通过不断更新迭代,求出满足整幅图像偏差等级error的阈值。
具体步骤为:首先设定初始阈值T0和偏差等级,此阈值将图像分割为前景和背景,此时可以算出前景和背景的平均灰度值T1和T2,则新的最佳阈值为T_center=(T1+T2),将新阈值与上一个阈值比较。若两者之差在偏差等级之内,则将标志位置为0,结束运算,得到的阈值极为当前阈值;若大于此偏差,则标志位置为1,继续下一次循环运算,由此逐渐逼近真实阈值。
代码实现
do{
for(i=0;i<MT9V03X_H;i++)
{
for(j=0;j<MT9V03X_W;j++)
{
if(Im[i][j] < T2)
{
S0 += Im[i][j];
N0++; //像素点数统计
}
else
{
S1 += Im[i][j];
N1++; //像素点数统计
}
}
}
T1 = S0/N0; //平均灰度值