请问哪里有熵编码器的源码?

binling 2004-01-05 04:29:20
huffman 算术编码,网上应该有源码吧?
...全文
58 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hahu 2004-01-09
  • 打赏
  • 举报
回复
上面是将rgb的数据进行编码,然后将结果显示到一个对话框
类变量如下
int m_iColorNum;//颜色数,24位也当它是256色,须提供
FLOAT *m_fFreq;//每一种颜色的出现概率,参考后面代码
CString *m_strCode;//指向编码结果数组的指针
// Dialog Data
//{{AFX_DATA(CDlgHuffman)
enum { IDD = IDD_CODE_HUFFMAN };
CListCtrl m_lstTable;
double m_dEntropy;//图像熵
double m_dAvgCodeLen;//平均码长
double m_dEfficiency;//编码概率
调用的时候
for(i=0;i<iColorNum;i++)
{
fFreq[i]=0.0;
}

for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
lpSrc=(unsigned char*)lpDIBBits+lLineBytes*i+j;
fFreq[*(lpSrc)]+=1;//出现该颜色次数
}
}

lCountSum=lHeight*lWidth;

for(i=0;i<iColorNum;i++)
{
fFreq[i]/=(FLOAT)lCountSum;//求得概率
}
CDlgHuffman dlgPara;
dlgPara.m_fFreq=fFreq;
dlgPara.m_iColorNum=iColorNum;
dlgPara.DoModal();
hahu 2004-01-09
  • 打赏
  • 举报
回复

BOOL CDlgHuffman::OnInitDialog()
{
CDialog::OnInitDialog();

CString str;

LONG i;
LONG j;
LONG k;
FLOAT fT;
LV_ITEM lvitem;
int iActualItem;

m_dEntropy=0.0;
m_dAvgCodeLen=0.0;

for(i=0;i<m_iColorNum;i++)
{
if(m_fFreq[i]>0)
{
m_dEntropy-=m_fFreq[i]*log(m_fFreq[i])/log(2.0);
}
}

FLOAT *fTemp;

int *iMap;

fTemp=new FLOAT[m_iColorNum];
iMap=new int[m_iColorNum];
m_strCode=new CString[m_iColorNum];

for(i=0;i<m_iColorNum;i++)
{
fTemp[i]=m_fFreq[i];
iMap[i]=i;
}

for(j=0;j<m_iColorNum-1;j++)
{
for(i=0;i<m_iColorNum-j-1;i++)
{
if(fTemp[i]>fTemp[i+1])
{
fT=fTemp[i];
fTemp[i]=fTemp[i+1];
fTemp[i+1]=fT;

for(k=0;k<m_iColorNum;k++)
{
if(iMap[k]==i)
{
iMap[k]=i+1;
}
else if(iMap[k]==i+1)
{
iMap[k]=i;
}
}
}
}
}


for(i=0;i<m_iColorNum-1;i++)
{
if(fTemp[i]>0)
{
break;
}
}
for(;i<m_iColorNum-1;i++)
{
for(k=0;k<m_iColorNum;k++)
{
if(iMap[k]==i)
{
m_strCode[k]="1"+m_strCode[k];
}
else if(iMap[k]==i+1)
{
m_strCode[k]="0"+m_strCode[k];
}
}
fTemp[i+1]+=fTemp[i];

for(k=0;k<m_iColorNum;k++)
{
if(iMap[k]==i)
{
iMap[k]=i+1;
}
}
for(j=i+1;j<m_iColorNum-1;j++)
{
if(fTemp[j]>fTemp[j+1])
{
fT=fTemp[j];
fTemp[j]=fTemp[j+1];
fTemp[j+1]=fT;
for(k=0;k<m_iColorNum;k++)
{
if(iMap[k]==j)
{
iMap[k]=j+1;
}
else if(iMap[k]==j+1)
{
iMap[k]=j;
}
}
}
else
{
break;
}
}
}
for(i=0;i<m_iColorNum;i++)
{
m_dAvgCodeLen+=m_fFreq[i]*m_strCode[i].GetLength();
}
m_dEfficiency=m_dEntropy/m_dAvgCodeLen;

UpdateData(FALSE);
m_lstTable.ModifyStyle(LVS_TYPEMASK,LVS_REPORT);
m_lstTable.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_FLATSB);
m_lstTable.InsertColumn(0,"灰度值",LVCFMT_LEFT,60,0);
m_lstTable.InsertColumn(1,"出现概率",LVCFMT_LEFT,78,0);
m_lstTable.InsertColumn(2,"哈夫曼编码",LVCFMT_LEFT,110,1);
m_lstTable.InsertColumn(3,"码字长度",LVCFMT_LEFT,78,2);

lvitem.mask=LVIF_TEXT;
for(i=0;i<m_iColorNum;i++)
{
lvitem.iItem=m_lstTable.GetItemCount();
str.Format("%u",i);
lvitem.iSubItem=0;
lvitem.pszText=(LPTSTR)(LPCTSTR)str;
iActualItem=m_lstTable.InsertItem(&lvitem);
lvitem.iItem=iActualItem;
lvitem.iSubItem=1;
str.Format("%f",m_fFreq[i]);
lvitem.pszText=(LPTSTR)(LPCTSTR)str;
m_lstTable.SetItem(&lvitem);

lvitem.iSubItem=2;
lvitem.pszText=(LPTSTR)(LPCTSTR)m_strCode[i];
m_lstTable.SetItem(&lvitem);
lvitem.iSubItem=3;
str.Format("%u",m_strCode[i].GetLength());
lvitem.pszText=(LPTSTR)(LPCTSTR)str;
m_lstTable.SetItem(&lvitem);
}
delete []fTemp;
delete []iMap;
delete []m_strCode;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

4,445

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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