图像分割的依据是认为图像中各区域具有不同的特性(比如,灰度,颜色,纹理)。图像分割的目的是将图像划分成若干个具有相近或相同特性的子区域,以便继续在分割成的相关区域中提取目标,并进而根据目标的特征或结构信息对其进行分类和识别,最后再给出对整幅图像分析结果的描述信息。
图像分割的方法有:基于边缘检测的图像分割,基于阙值的分割方法,基于跟踪的图像分割,基于区域的图像分割。
这里我们讨论基于阙值的图像分割,这种方法的核心便是如何取得合适的阙值(本文主要适用于具有双峰形直方图的灰度图像)。在一般的双峰形直方图谷底就是我们要找的阙值,那么如何寻找呢?
这里介绍一种叫做大津算法的方法。
最大类间方差法是由日本学者大津展之于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。它是按图像的灰度特性,将图像分成背景和目标两部分。背景和目标之间的类间方差越大,说明构成图像的两部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。对于图像,前景(即目标)和背景的分割阈值记作,属于前景的像素点数占整幅图像的比例记为,其平均灰度;背景像素点数占整幅图像的比例为,其平均灰度为。图像的总平均灰度记为,类间方差记为。假设图像的背景较暗,并且图像的大小为,图像中像素的灰度值小于阈值的像素个数记作,像素灰度大于阈值T的像素个数记作,则有:
- (1)
- (2)
- (3)
- (4)
- (5)
- (6)
将式(5)代入式(6),得到等价公式:
- (7)
采用遍历的方法得到使类间方差最大的阈值,即为所求。
下面附上我做的一个例子 和大津算法略有不同
主要思想为:在一个直方图中从最低灰度级到最高灰度级将每一个灰度级作为阙值计算方差(及上面的g)其中n1,n2,m1,m2分别对应上面的w0,w1,u0,u1只是n1,n2,m1,m2,的计算方法不同。
int DaJin(long hist[256])
{
int T=0; //T为寻找的那个阙值
int i,j;
int n1=0,n2=0,m1,m2,max=0;
for(i=0;i<256;i++)
{
n1=0;n2=0;
for(j=1;j<256;j++)
{
if(j<i)
n1+=hist[j];
if(j>i)
n2+=hist[j];
}
m1=n1/(i+1);
m2=n2/(256-i);
if(max<n1*n2*(m1-m2)*(m1-m2))
{
max=n1*n2*(m1-m2)*(m1-m2);
T=i;
}
}
return T;
}
原图:
结果图: