这个一维最大熵阈值分割算法,有几处不明白,很着急!

lastwesting 2008-06-14 01:38:55
有几处不明白,这里为什么要定义一个“图像的熵 double fEntropy=0.0;”,我理解的图像的熵不就是目标的熵加上背景的熵么?还有,我只知道有目标和背景的概率和熵,这个低灰度区的概率和熵是什么意思?最后“求目标区域和背景区域的熵的和”的公式也看不懂,和标准公式不一样,标准公式就是把目标和背景的熵加在一起取他的最大值呀。急用这个算法,非常着急。

unsigned char CImgPro::EntropyThreshold()
{
// 指向源图像的指针
LPSTR lpSrc;

//循环变量
long i;
long j;

//像素值
unsigned char pixel;

//阈值
unsigned char iThreshold;

//直方图数组
long lHistogram[256];
//灰度级出现的概率
double fProb[256];
//求目标区域和背景区域的熵的和
double fOBEntropy=0.0;
//图象的熵
double fEntropy=0.0;
//低灰度区的熵
double fLowEntropy=0.0;
//低灰度区的概率
double fLowProb=0.0;
//一维最大熵
double fMaxEntropy=0.0;

for (i = 0; i < 256;i++)
{
lHistogram[i]=0;
}

for(i=0;i<256;i++)
fProb[i]=0.0;

//求灰度直方图
for (i = 0;i <m_lHeight ;i++)
{
for(j = 0;j <m_lWidth ;j++)
{
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (char *)m_lpBits + m_lWidth * i + j;
pixel = (unsigned char)*lpSrc;
lHistogram[pixel]++;
}
}

//求灰度级出现的概率
ofstream data("E:\\a.dat");
for(i=0;i<256;i++)
{
fProb[i]=((double)lHistogram[i])/(m_lWidth*m_lHeight);
data<<fProb[i]<<endl;
}


//求图象的熵
for(i=0;i<256;i++)
{
if(fProb[i]!=0.0)
fEntropy+=-fProb[i]*log10(fProb[i]);
}

//求阈值
for(i=0;i<256;i++)
{
for(j=0;j<=i;j++)
{
//求低灰度区的概率与熵
fLowProb+=fProb[j];
if(fProb[j]!=0.0)
fLowEntropy+=(-fProb[j]*log10(fProb[j]));
}

//求目标区域和背景区域的熵的和
if(fLowProb==1)
{
fOBEntropy=fEntropy;
}
else
{
fOBEntropy=log10(fLowProb*(1-fLowProb))+fLowEntropy/fLowProb+
(fEntropy-fLowEntropy)/(1-fLowProb);
}

if(fOBEntropy>fMaxEntropy)
{
//找使熵最小的iGray
fMaxEntropy=fOBEntropy;
iThreshold=(unsigned char)i;
}

fLowProb=0.0;
fLowEntropy=0.0;
}

//返回阈值
return iThreshold;
}
...全文
654 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
kawa224 2010-12-29
  • 打赏
  • 举报
回复
急求一维最大熵的参考文献和用matlab编写的源代码

19,468

社区成员

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

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