图像处理阈值分割之OTSU/大津阈值原理及其实现

图像处理阈值分割之最大类间方差法/大津法/OTSU

简介:

        最大类间方差法是由日本学者大津于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。它是按图像的灰度特性,将图像分成背景和目标2部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

         对于大小为 M×N 的图像I(x,y),前景(即目标)和背景的分割阈值记作T,属于前景的像素点数占整幅图像的比例记为ω0,其平均灰度μ0;背景像素点数占整幅图像的比例为ω1,其平均灰度为μ1。图像的总平均灰度记为μ,类间方差记为g。
图像中像素的灰度值小于阈值T的像素个数记作N0,像素灰度大于阈值T的像素个数记作N1,则有:
      ω0=N0/ M×N       (1)
      ω1=N1/ M×N       (2)
      N0+N1=M×N       (3)
      ω0+ω1=1            (4)
      μ=ω0*μ0+ω1*μ1                            (5)
      g=ω0(μ0-μ)^2+ω1(μ1-μ)^2          (6)

 

1、算法原理

OTSU的公式如下,如果当前阈值为t,

      w0:前景点所占比例

      w1:背景点所占比例,w1 = 1- w0

      u0:前景灰度均值

      u1:背景灰度均值

       u:全局灰度均值,u = w0*u0 + w1*u1

      g:类间最大方差,g = w0(u0-u)*(u0-u) + w1(u1-u)*(u1-u) = w0*(1 – w0)*(u0 - u1)* (u0 - u1)

      目标函数为 g,g 越大,t 就是越好的阈值。为什么采用这个函数作为判别依据,直观是这个函数反映了前景和背景的差值,

差值越大,前景与背景差别越大,阈值越好。

2、算法实现伪代码(C/C++/Python实现)

3、算法实现代码(C/C++/Python实现)

(1)C/C++实现OTSU/大津阈值,代码:

//OTSU阈值
int Otsu(IplImage* src)
{
	int height=src->height;    
	int width=src->width;        

	//histogram    
	float histogram[256] = {0};    
	for(int i=0; i < height; i++)  
	{    
		unsigned char* p=(unsigned char*)src->imageData + src->widthStep * i;    
		for(int j = 0; j < width; j++)   
		{    
			histogram[*p++]++;//统计灰度直方图.
		}    
	}    
	//normalize histogram    
	int size = height * width;     
	for(int i = 0; i < 256; i++)  
	{    
		histogram[i] = histogram[i] / size;//直方图归一化.
	}    

	//average pixel value    
	float avgValue=0;    
	for(int i=0; i < 256; i++)  
	{    
		avgValue += i * histogram[i];//整幅图像的平均灰度.
	}     

	int threshold;      
	float maxVariance=0;    
	float w = 0, u = 0;    
	for(int i = 0; i < 256; i++)   
	{    
		w += histogram[i];//假设当前灰度i为阈值, 0~i 灰度的像素(假设像素值在此范围的像素叫做前景像素) 所占整幅图像的比例.
		u += i * histogram[i];// 灰度i 之前的像素(0~i)的平均灰度值:前景像素的平均灰度值.

		float t = avgValue * w - u;    
		float variance = t * t / (w * (1 - w) );    
		if(variance > maxVariance)   
		{    
			maxVariance = variance;    
			threshold = i;    
		}    
	}    

	return threshold;    
}

(2)OpenCV实现OTSU/大津阈值

4、关于最大类间方差法(otsu)的性能:

类间方差法对噪音和目标大小十分敏感,它仅对类间方差为单峰的图像产生较好的分割效果。

当目标与背景的大小比例悬殊时,类间方差准则函数可能呈现双峰或多峰,此时效果不好,但是类间方差法是用时最少的。

猜你喜欢

转载自blog.csdn.net/yishuihanq/article/details/106053358