求讲解图像分割 阈值选取算法!!!!!!(有源码)

conquerorren 2009-05-21 01:49:34
下面这段代码是实现将相似度计算完后的灰度图转换为只有黑白颜色的二值化图像
然后其中用红色标注的部分是二值化阈值选取的核心代码
我想问下:
这是用哪一种阈值选取方法来实现的!!!急......!!!
具体详细过程希望给讲讲,谢谢了

//***********************************************************************
//函数名称: 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;
}
...全文
257 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengleting 2009-05-29
  • 打赏
  • 举报
回复
在这边等了,等高手来,O(∩_∩)O~
libin009 2009-05-28
  • 打赏
  • 举报
回复
也等着高手讲解。。。。
conquerorren 2009-05-21
  • 打赏
  • 举报
回复
第一次发...Hehe,麻烦帮忙分析分析啦
cau228charm 2009-05-21
  • 打赏
  • 举报
回复
好像发过一次了
aaaa3105563 2009-05-21
  • 打赏
  • 举报
回复
帮顶··

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧