迭代选择阈值法
原理:
代码:
//图像迭代选择阈值法
int MainWindow::DetectThreshold_pro(QImage *inputImage,int nMaxIter, int &nDiffRet)
{
int nThreshold;
QColor oldColor;
nDiffRet = 0;
//直方图数组
int nHistogram[255] = {0};
int bt;
int nMax = 0;
int nMin = 255;
//扫描图像,计算出最大值 最小灰度的直方图
for(int i = 0;i<inputImage->height(); i++)
{
for(int j = 0; j<inputImage->width(); j++)
{
oldColor = QColor(inputImage->pixel(j,i));
bt = oldColor.red();
if(bt<nMin)
{
nMin = bt;
}
if(bt>nMax)
{
nMax = bt;
}
nHistogram[bt] ++;
}
}
int nTotalGray = 0; //灰度值得和
int nTotalPixel = 0; //像素数的和
int nNewThreshold = (nMax + nMin)/2; //初始阈值
nDiffRet = nMax - nMin;
if(nMax == nMin)
{
nThreshold = nNewThreshold;
}
else {
nThreshold = 0;
//迭代开始,直接迭代次数达到100 或新阈值与上一轮得到的阈值相等,迭代结束
while(nThreshold != nNewThreshold && nMaxIter>0)
{
nThreshold = nNewThreshold;
nTotalGray = 0;
nTotalPixel = 0;
//计算图像中小于当前的阈值部分的平均灰度
for(int i = nMin; i<nThreshold; i++)
{
nTotalGray += nHistogram[i]*i;
nTotalPixel += nHistogram[i];
}
int nMean1GrayValue = nTotalGray/nTotalPixel;
nTotalGray = 0;
nTotalPixel = 0;
//计算图像中小于当前的阈值部分的平均灰度
for(int i = nThreshold; i<nMax; i++)
{
nTotalGray += nHistogram[i]*i;
nTotalPixel += nHistogram[i];
}
int nMean2GrayValue = nTotalGray/nTotalPixel;
nNewThreshold = (nMean1GrayValue + nMean2GrayValue) / 2;
nDiffRet = abs(nMean1GrayValue - nMean2GrayValue);
}
}
return nThreshold;
}