int GetThresholdOTSU(Mat imgInput)
{int hist[256] = { 0 };double pro_hist[256] = { 0.0 };int row = imgInput.rows;int col = imgInput.cols;for (int i = 0; i < row; ++i) //统计每个灰度的数量{for (int j = 0; j < col; ++j){int temp = imgInput.at<uchar>(i, j);hist[temp]++;}}for (int i = 0; i < 256; ++i)//计算每个灰度级占图像的概率pro_hist[i] = (double)hist[i] / (double)(row * col);double mG = 0.0;//平均灰度值for (int i = 0; i < 256; ++i)mG += i * pro_hist[i];double dbMaxVariance = 0.0;int nMaxthread = 0;for (int i = 0; i < 256; ++i)//统计前景和背景的平均灰度值,并计算类间方差{double m1 = 0.0; double m2 = 0.0; double mk = 0.0; double p1 = 0.0; double p2 = 0.0;for (int j = 0; j < i; ++j){p1 += pro_hist[j];mk += j * pro_hist[j];}m1 = mk / p1; //背景平均灰度p2 = 1 - p1; //p1+p2=1;mG=p1*m1+p2*m2;m2 = (mG - mk) / p2; //前景平均灰度double dbCurrVariance = p1 * p2 * (m1 - m2) * (m1 - m2);//计算类间方差,g=ω0(μ0-μ)^2+ω1(μ1-μ)^2if (dbCurrVariance > dbMaxVariance){dbMaxVariance = dbCurrVariance;nMaxthread = i;}}return nMaxthread;
}