OpenCV 阈值化处理(1) OTSU阈值化

在阈值处理中,最常用到的就是OTSU算法,这是一种寻找图像阈值的最大类间方差算法。

OTSU算法(大津法或最大类间方差法)的步骤:

  1. 统计灰度级中每个像素在整幅图像中的个数。
  2. 计算每个像素在整幅图像的概率分布。
  3. 对灰度级进行遍历搜寻,计算当前灰度值下前景背景类间概率。
  4. 通过目标函数计算出类内与类间方差下对应的阈值。

代码如下

#include
#include
#include
#include
using namespace std;
using namespace cv;

//OTSU 法函数的实现
int OTSU(Mat srcimage)
{
	int nCols = srcimage.cols;
	int nRows = srcimage.rows;
	int threshold = 0;
	//初始化参数
	int nSumPix[256];
	float nProDis[256];
	for(int i = 0;i < 256;i++)
	{
		nSumPix[i] = 0;
		nProDis[i] = 0;
	}

	//统计灰度级中每个像素在整幅图像中的个数
	for (int i = 0;i < nCols; i++)
	{
		for( int j = 0; j < nRows; j++)
		{
			nSumPix[(int)srcimage.at(i,j)]++;
		}
	}
	//计算每个灰度级炸图像中的概率分布
	for ( int i = 0 ; i < 256; i++)
	{
		nProDis[i] = (float)nSumPix[i] / (nCols*nRows);
	}
	//遍历灰度级0-256,计算出最大类间方差下的阈值
	float w0,w1,u0_temp,u1_temp,u0,u1,delta_temp;
	double delta_max = 0.0;
	for (int i = 0; i < 256;i++)
	{
		//初始化相关参数
		w0 = w1 = u0_temp = u1_temp = u0 = u1 = delta_temp = 0;
		for (int j=0;j < 256;j++)
		{
			//背景部分
			if (j <= i)
			{

				w0 +=nProDis[j];
				u0_temp += j*nProDis[j];
			}
			//前景部分
			else
			{
				w1 += nProDis[j];
				u1_temp += j*nProDis[j];
			}
		}
		//分别计算各类平均灰度
		u0 = u0_temp / w0;
		u1 = u1_temp /w1;
		delta_temp = (float)(w0*w1*pow((u0 - u1),2));
		//依次找到最大类间方差下的阈值
		if(delta_temp > delta_max)
		{
			delta_max = delta_temp;
			threshold = i;
		}
	}
	return threshold;
}

int main()
{

	//图像读取及判断
	Mat srcimage = imread("timg.jpg");
	if( !srcimage.data)
		return 1;
	//转灰度图
	 namedWindow("srcimage",WINDOW_NORMAL);
	 imshow("srcimage",srcimage);
	 Mat srcgray;
	 cvtColor(srcimage,srcgray,CV_BGR2GRAY);
	 namedWindow("srcgray",WINDOW_NORMAL);
	 imshow("srcgray",srcgray);

	//用OTSU二值化法得到阈值
	 int otsuThreshold = OTSU(srcgray);
	 cout<< otsuThreshold <(i,j) > otsuThreshold)
				otsuResultImage.at(i,j) = 255;
			 else
				 otsuResultImage.at(i,j) = 0;
		 }
	 }
	 namedWindow("otsuResultImage",WINDOW_NORMAL);
	 imshow("otsuResultImage",otsuResultImage);
	 waitKey(0);
	 return 0 ;
}





运行结果如下

你可能感兴趣的:(OpenCV学习)