在阈值处理中,最常用到的就是OTSU算法,这是一种寻找图像阈值的最大类间方差算法。
OTSU算法(大津法或最大类间方差法)的步骤:
- 统计灰度级中每个像素在整幅图像中的个数。
- 计算每个像素在整幅图像的概率分布。
- 对灰度级进行遍历搜寻,计算当前灰度值下前景背景类间概率。
- 通过目标函数计算出类内与类间方差下对应的阈值。
代码如下
#include<stdio.h>
#include<string>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\opencv.hpp>
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<uchar>(i,j)]++;
}
}
//计算每个灰度级炸图像中的概率分布
for ( int i = 0 ; i < 256; i++)
{
nProDis[i] =