ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:126.48KB ,
资源ID:9683329      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9683329.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(多媒体 图像的哈夫曼编码实现.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

多媒体 图像的哈夫曼编码实现.docx

1、多媒体 图像的哈夫曼编码实现实验二 图像的哈夫曼编码实现一 实验目的使学生掌握图像的哈夫曼编码及哈夫曼编码的实现过程。二 实验环境具有多媒体处理功能的计算安装有Windows操作系统,安装有Visual c+6.0程序设计软件。三 实验要求学习相关理论指导,掌握相关程序设计知识;按照实验步骤要求完成程序设计任务,书写实验报告,试验报告中要求包含程序实现的主要程序代码和程序运行结果或结果说明。四 实验内容和实验步骤1、使用应用程序向导生成哈夫曼编码程序框架和用于数据显示的界面图2.1 显示界面1)创建多文档应用程序:HuffmanExp(1)使用资源管理制作对话框IDD_DLG_HUFFMAN图

2、2.2 资源管理制作对话框资源号分别为:IDC_LST_Table,IDC_EDIT1,IDC_EDIT2,IDC_EDIT3图2.3 资源管理制作对话框2(2)对应的数据成员定义为:CListCtrl m_lstTable; double m_dEntropy; double m_dAvgCodeLen; double m_dEfficiency;(3)为该对话框定义类CDlgHuffmanclass CDlgHuffman : public CDialog/ Constructionpublic: CDlgHuffman(CWnd* pParent = NULL); / standard

3、constructor/ Dialog Data /AFX_DATA(CDlgHuffman) enum IDD = IDD_DLG_HUFFMAN ; CListCtrl m_lstTable; double m_dEntropy; double m_dAvgCodeLen; double m_dEfficiency; /AFX_DATApublic: / 灰度级别数目 int m_iColorNum; / 各个灰度值出现频率 FLOAT * m_fFreq; / 哈夫曼编码表 CString * m_strCode;/ Overrides / ClassWizard generated v

4、irtual function overrides /AFX_VIRTUAL(CDlgHuffman) protected: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support /AFX_VIRTUAL/ Implementationprotected: / Generated message map functions /AFX_MSG(CDlgHuffman) virtual BOOL OnInitDialog(); /AFX_MSG DECLARE_MESSAGE_MAP();3)重载视图类的OnIniti

5、alUpdate()函数,用于获取DIB文件的信息来设置滚动显示范围。void CHuffmanExpView:OnInitialUpdate() CScrollView:OnInitialUpdate(); CHuffmanExpDoc* pDoc = GetDocument(); CSize sizeTotal(pDoc-m_pDib-GetWidth(), pDoc-m_pDib-GetHeight(); SetScrollSizes(MM_TEXT, sizeTotal); CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()-m_pMai

6、nWnd; ASSERT_KINDOF(CMainFrame, pAppFrame); CRect rc; pAppFrame-GetClientRect(&rc); if (rc.Width() = sizeTotal.cx & rc.Height() = sizeTotal.cy & (sizeTotal.cx0 | sizeTotal.cy0) ResizeParentToFit(FALSE);4)重载视图类的OnDraw(CDC* pDC)函数实现图像显示。void CHuffmanExpView:OnDraw(CDC* pDC) CHuffmanExpDoc* pDoc = GetD

7、ocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here if (! pDoc-m_pDib-IsEmpty() pDoc-m_pDib-Display(pDC, 0, 0);其中CDib类的各成员函数为:class CDib : public CObject DECLARE_SERIAL(CDib)/ Public member functionpublic: / constructor CDib(); / create BOOL Create(DWORD dwWidth, DWORD dwHeight

8、); BOOL Create(DWORD dwWidth, DWORD dwHeight, WORD wBitCount); BOOL Create(LPBYTE lpDIB); BOOL Create(LPBYTE lpDIB, / DIB pointer WORD wBitCount); / bits/pixel BOOL Create(HBITMAP hBitmap); / DIBSection BOOL Create(HBITMAP hBitmap, / DIBSection WORD wBitCount); / bits/pixel BOOL Create(HBITMAP hBitm

9、ap, / Bitmap handle HPALETTE hPalette); / Palette handle BOOL Create(HBITMAP hBitmap, / Bitmap handle HPALETTE hPalette, / Palette handle WORD wBitCount); / bits/pixel BOOL Create(CRect rcScreen); BOOL Create(HWND hWnd, WORD fPrintArea); BOOL Create(HWND hWnd, CRect rcClientArea); / load/save BOOL L

10、oad(UINT uIDS, LPCTSTR lpszDibType); BOOL Load(LPCTSTR lpszDibRes, LPCTSTR lpszDibType); BOOL Load(LPCTSTR lpszDibFile); BOOL Save(LPCTSTR lpszDibFile); BOOL Read(CFile *pFile); BOOL Write(CFile *pFile); / clone CDib * Clone(); / deconstructor virtual CDib(); / destroy void Destroy(); / overlaying S

11、erialize virtual void Serialize(CArchive &ar); / display BOOL Display(CDC * pDC, int xDest, int yDest, int nWidthDest, int nHeightDest, int xSrc, int ySrc, DWORD dwRop=SRCCOPY); BOOL Display(CDC * pDC, int xDest, int yDest, int nWidthDest, int nHeightDest, int xSrc, int ySrc, int nWidthSrc, int nHei

12、ghtSrc, DWORD dwRop=SRCCOPY); BOOL Display(CDC* pDC, int x, int y, DWORD dwRop=SRCCOPY); BOOL Display(CDC* pDC, CRect rcDest, CRect rcSrc,DWORD dwRop=SRCCOPY); BOOL DisplayPalette(CDC* pDC, CRect rc); / DC for modify DIB CDC* BeginPaint(CDC *pDC); void EndPaint(); / DDB and palette BOOL BuildBitmap(

13、); BOOL BuildPalette(); / attributes BOOL IsEmpty(); DWORD GetCompression(); WORD GetBitCount(); LONG GetWidth(); LONG GetHeight(); LONG GetWidthBytes(); WORD GetColorNumber(); WORD GetPaletteSize(); CBitmap* GetBitmap(); CPalette* GetPalette(); HANDLE GetHandle(); LPBYTE GetBitsPtr(); COLORREF GetP

14、ixel(LONG x, LONG y); LONG GetPixelOffset(LONG x, LONG y);/ private member functionprivate: BOOL UpdateInternal();/ public member datapublic: HDIB m_hDib; HBITMAP m_hBitmap; / handle of DIBSection CPalette* m_pPalette; CBitmap* m_pBitmap;/ private member dataprivate: / for drawing in DIB CDC * m_pMe

15、mDC; CBitmap* m_pBitmapTmp; CPalette* m_pPaletteTmp;其函数定义参考例程中的Dib.cpp文件。2、添加图像编码菜单及子菜单哈夫曼编码,使用该菜单打开用于显示哈夫曼编码信息的对话框,执行相应哈夫曼编码处理和显示。(1)创建菜单资源。哈夫曼编码菜单资源号为:ID_HUFFMAN(2)定义菜单命令响应函数void CHuffmanExpView:OnHuffman() / TODO: Add your command handler code here / 查看哈夫曼编码表 / 获取文档 CHuffmanExpDoc* pDoc = GetDocu

16、ment(); / 指向源图像象素的指针 unsigned char * lpSrc; / 指向DIB的指针 LPBYTE lpDIB; / 指向DIB象素指针 LPBYTE lpDIBBits; / DIB的高度 LONG lHeight; / DIB的宽度 LONG lWidth; / 图像每行的字节数 LONG lLineBytes; / 图像象素总数 LONG lCountSum; / 循环变量 LONG i; LONG j; / 保存各个灰度值频率的数组指针 FLOAT * fFreq; / 获取当前DIB颜色数目 int iColorNum; / 锁定DIB lpDIB = (LP

17、BYTE) :GlobalLock(HGLOBAL) pDoc-m_pDib-m_hDib); / 找到DIB图像象素起始位置 lpDIBBits = :FindDIBBits(lpDIB); / 获取当前DIB颜色数目 iColorNum = :DIBNumColors(lpDIB); / 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推) if (iColorNum != 256) / 提示用户 MessageBox(目前只支持256色位图哈夫曼编码!, 系统提示 , MB_ICONINFORMATION | MB_OK); / 解除锁定 :GlobalUnlo

18、ck(HGLOBAL) pDoc-m_pDib-m_hDib); / 返回 return; / 更改光标形状 BeginWaitCursor(); / 分配内存 fFreq = new FLOATiColorNum; / 计算DIB宽度 lWidth = :DIBWidth(lpDIB); / 计算DIB高度 lHeight = :DIBHeight(lpDIB); / 计算图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth * 8); / 重置计数为0 for (i = 0; i iColorNum; i +) / 清零 fFreqi = 0.0; / 计算各个灰

19、度值的计数(对于非256色位图,此处给数组fFreq赋值方法将不同) for (i = 0; i lHeight; i +) for (j = 0; j lWidth; j +) / 指向图像指针 lpSrc = (unsigned char *)lpDIBBits + lLineBytes * i + j; / 计数加1 fFreq*(lpSrc) += 1; / 计算图像象素总数 lCountSum = lHeight * lWidth; / 计算各个灰度值出现的概率 for (i = 0; i m_pDib-m_hDib); / 恢复光标 EndWaitCursor();(3)BOOL

20、CDlgHuffman:OnInitDialog() / CDialog:OnInitDialog(); / TODO: Add extra initialization here / 字符串变量 CString str; / 循环变量 LONG i; LONG j; LONG k; / 中间变量 FLOAT fT; / ListCtrl的ITEM LV_ITEM lvitem; / 中间变量,保存ListCtrl中添加的ITEM编号 int iActualItem; / 调用默认得OnInitDialog()函数 CDialog:OnInitDialog(); / 初始化变量 m_dEntr

21、opy = 0.0; m_dAvgCodeLen = 0.0; / 计算图像熵 for (i = 0; i 0) / 计算图像熵 m_dEntropy -= m_fFreqi * log(m_fFreqi) / log(2.0); / 保存计算中间结果的数组 FLOAT *fTemp; / 保存映射关系的数组 int * iMap; / 分配内存 fTemp = new FLOATm_iColorNum; iMap = new intm_iColorNum; m_strCode = new CStringm_iColorNum; / 初始化fTemp为m_fFreq for (i = 0; i

22、 m_iColorNum; i +) / 赋值 fTempi = m_fFreqi; iMapi = i; / 用冒泡法对进行灰度值出现的概率排序,结果保存在数组fTemp中 for (j = 0; j m_iColorNum - 1; j +) for (i = 0; i fTempi + 1) / 互换 fT = fTempi; fTempi = fTempi + 1; fTempi + 1 = fT; / 更新映射关系 for (k = 0; k m_iColorNum; k +) / 判断是否是fTempi的子节点 if (iMapk = i) / 改变映射到节点i+1 iMapk =

23、 i + 1; else if (iMapk = i + 1) / 改变映射到节点i iMapk = i; / / 计算哈夫曼编码表 / 找到概率大于0处才开始编码 for (i = 0; i 0) break; / 开始编码 for (; i m_iColorNum - 1; i +) / 更新m_strCode for (k = 0; k m_iColorNum; k +) / 判断是否是fTempi的子节点 if (iMapk = i) / 改变编码字符串 m_strCodek = 1 + m_strCodek; else if (iMapk = i + 1) / 改变编码字符串 m_s

24、trCodek = 0 + m_strCodek; / 概率最小的两个概率相加,保存在fTempi + 1中 fTempi + 1 += fTempi; / 改变映射关系 for (k = 0; k m_iColorNum; k +) / 判断是否是fTempi的子节点 if (iMapk = i) / 改变映射到节点i+1 iMapk = i + 1; / 重新排序 for (j = i + 1; j fTempj + 1) / 互换 fT = fTempj; fTempj = fTempj + 1; fTempj + 1 = fT; / 更新映射关系 for (k = 0; k m_iCo

25、lorNum; k +) / 判断是否是fTempi的子节点 if (iMapk = j) / 改变映射到节点j+1 iMapk = j + 1; else if (iMapk = j + 1) / 改变映射到节点j iMapk = j; else / 退出循环 break; / 计算平均码字长度 for (i = 0; i m_iColorNum; i +) / 累加 m_dAvgCodeLen += m_fFreqi * m_strCodei.GetLength(); / 计算编码效率 m_dEfficiency = m_dEntropy / m_dAvgCodeLen; / 保存变动 UpdateData(FALSE); / / 输出计算结果 / 设置List控件样式 m_lstTable.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); / 给List控件添加Header m_lstTable.InsertColumn(0, 灰度值, LVCFMT_LEFT,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1