下面这段代码是实现将相似度计算完后的灰度图转换为只有黑白颜色的二值化图像
然后其中用红色标注的部分是二值化阈值选取的核心代码
我想问下:
这是用哪一种阈值选取方法来实现的!!!急......!!!
具体详细过程希望给讲讲,谢谢了//***********************************************************************
//函数名称: bool CalBinary()
//函数功能: 本函数将肤色似然度图像二值化
//***********************************************************************
bool CSkinModel::CalBinary() 

if(!m_bLikeliHoodReady)
return false; //申请临时数组并初始化,将原数组的值赋予临时数组
int i,j;
BYTE **temp;
temp = new BYTE*[m_nHeight];
for(i=0;i<m_nHeight;i++)
{
temp[i] = new BYTE[m_nWidth];
for(j=0;j<m_nWidth;j++)
{
temp[i][j] = 0;
}
} double min =10000000000000000.0;
int index = -1; //用index来记录合适的阈值 

         //先计算出像素最少的相似度段,以该段像素的中点作为二值化的分界点
//求取在相似度为0.05到0.55之间,以0.1为间隔的相似度段的像素数量,实现图片的二值化
for(int k=5;k>=0;k--)
{
//开始肤色点的个数,以后每次求的是范围扩大后增加的肤色点个数
double skinCount = 0;
for( i=0;i<m_nHeight;i++)
for( j=0;j<m_nWidth;j++)
{
if( m_pLikeliHoodArray[i][j]>k*0.1+0.05)
{
m_pBinaryArray[i][j] = 1;

else
{
m_pBinaryArray[i][j] = 0;
}

skinCount += (m_pBinaryArray[i][j] - temp[i][j]);
} if (skinCount < min)
{
min = skinCount;
index = 6-k;
}

for( i=0;i<m_nHeight;i++)
for( j=0;j<m_nWidth;j++)
{
temp[i][j] = m_pBinaryArray[i][j];
}
}

//用循环求出最佳的阈值index,再次遍历图片,更加精确二值化图片
double optimalThreshold = (7-index)*0.1; for( i=0;i<m_nHeight;i++)
for( j=0;j<m_nWidth;j++)
{
if (m_pLikeliHoodArray[i][j]> optimalThreshold)
{
m_pBinaryArray[i][j] = 1;

else
{
m_pBinaryArray[i][j] = 0;
}
} if(temp != NULL)
{
for(i=0;i<m_nHeight;i++)
if(temp[i]!=NULL)
delete temp[i];
delete temp;
} m_bBinaryReady = true; return true;
}