图像处理算法2——Otsu最佳阈值分割法

原创 2013年12月04日 18:43:27

    Otsu法是1979年由日本大津提出的。该方法在类间方差最大的情况下是最佳的,即统计鉴别分析中所用的度量。Otsu方法有一个重要的特性,就是它完全以在一幅图像的直方图上执行计算为基础,而直方图是很容易得到的一维阵列。

    具体的公式推理及公式细节就不说了,详见 Conzalez 那本书,我是第三版的,在P.479——P.482 上面。

给出具体步骤如下:

1、计算输入图像的直方图,并归一化。

2、计算累积均值mu,以及全局灰度均值。

3、计算被分到类1的概率q1,和被分到类2的概率q2。

4、用公式计算类间方差,sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2)

5、循环寻找类间方差最大值,并记下此时的阈值,即为最佳阈值。

6、利用最佳阈值进行图像阈值化。

关于otsu部分的程序代码如下:

double getThreshVal_Otsu_8u( const Mat& _src )
{
	Size size = _src.size();
	const int N = 256;
	int i, j, h[N] = {0};
	unsigned char* src;
	//直方图统计
	for( i = 0; i < size.height; i++ )
	{
		src = _src.data + _src.step*i;
		j = 0;
		for(j = 0; j < size.width; j++ )
			h[src[j]]++;
	}
	//像素平均值
	double mu = 0, scale = 1./(size.width*size.height);
	for( i = 0; i < N; i++ )
	{
		mu += i*(double)h[i];//累加均值
	}
	mu *= scale;//平均

	double mu1 = 0, q1 = 0;//q1 ,q2 为类1和类2的概率累积和,mu1=mg*q1
	double p_i, q2, mu2, sigma;
	double max_sigma = 0, max_val = 0;
	//循环求取最大阈值
	for( i = 0; i < N; i++ )
	{
		p_i = h[i]*scale;//直方图归一化
		mu1 *= q1;
		q1 += p_i;
		q2 = 1. - q1;
		mu1 = (mu1 + i*p_i)/q1;
		mu2 = (mu - q1*mu1)/q2;
		sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2);//类间方差
		if( sigma > max_sigma )
		{
			max_sigma = sigma;
			max_val = i;//记下使类间方差最大的阈值
		}
	}
	return max_val;//返回阈值
}

注意,上面这部分传递的图像是 Mat 类型的,和 Iplimage 类型在图像参数部分写法上有一点区别,注意区分开来

显示结果如下:



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

图像分割之(一)概述

图像分割之(一)概述 zouxy09@qq.com http://blog.csdn.net/zouxy09          所谓图像分割指的是根据灰度、颜色、纹理和形状等特征把图像划分成若...

区域生长算法

图像分割是一种重要的图像处理技术,而区域生长是图像分割技术的一种。区域生长的基本思想是将具有相似性的像素集合起来构成区域。首先对每个需要分割的区域找出一个种子像素作为生长的七点,然后将种子像素周围邻域...

区域增长算法

http://blog.csdn.net/byxdaz/article/details/765158 区域增长算法递归实现 void RegionGrowTwo(int nSeedX, int n...

三维坐标系的旋转矩阵

为了方便自己记忆,记录一下三维坐标旋转矩阵的推导过程。     坐标的旋转变换在很多地方都会用到,比如机器视觉中的摄像机标定、图像处理中的图像旋转、游戏编程等。     任何维的旋转可以表述为向量...

区域生长算法原理及MATLAB实现

1. 基于区域生长算法的图像分割原理 数字图像分割算法一般是基于灰度值的两个基本特性之一:不连续性和相似性。前一种性质的应用途径是基于图像灰度的不连续变化分割图像,比如图像的边缘。第二种性质的主要应用...

区域生长法的编程实现——程序员数字图像处理第一步

数字图像处理的书数不胜数。相关的方法,从直方图、卷积到小波、机器学习方面的方法也举不胜举。 OpenCV库给我们提供了一整套图像存储、显示方法外,也集成了很多很多的图像、视频处理算法以及机器学习算...

图像处理算法1——区域生长法

前几天看到一篇博客,题为《为什么你应该写博客》,学到了很多,同时也思考了很多,里面讲到“用博客的形式来记录下你有价值的思考,会带来很多好处,却没有任何明显的坏处”,一句话概括就是:书写是为了更好的思考...

区域生长算法

区域生长算法 :既是根据事先定义的准则将像素或者子区域聚合成更大的区域。基本方法是以“一组”种子开始,将与种子性质相似(灰度级或颜色的特定范围)的相邻像素附加到生长区域的种子上。Halcon中的区域...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)