有關霍夫曼編碼的兩個習題解答
1、利用程式huff_enc和huff_dec進行以下操作(在每種情況下,利用由被壓縮影象生成的碼本)。
(a)對Sena、Sensin和Omaha影象時行編碼。
(b)編寫一段程式,得到相鄰之差,然後利用huffman對差值影象進行編碼。
(a)執行結果:
影象壓縮情況如下:
檔名(壓縮前) |
大小 |
檔名(壓縮後) |
大小 |
壓縮比 |
Sena.img |
64kb(65536位元組) |
sena.en.img |
55kb(56623位元組) |
1.16:1 |
Sensin.img |
64kb(65536位元組) |
sensin.img |
59kb(60149位元組) |
1.09:1 |
Omaha.img |
64kb(65536位元組) |
omaha.img |
56kb(57094位元組) |
1.15:1 |
(b)程式執行結果如下:
差值影象編碼:
檔名(壓縮前) |
大小 |
檔名(壓縮後) |
大小 |
壓縮比 |
Sena.img |
64kb(65536位元組) |
cha_sena.img |
31kb(31685位元組) |
2.07:1 |
Sensin.img |
64kb(65536位元組) |
cha_sensin.img |
37kb(37262位元組) |
1.76:1 |
Omaha.img |
64kb(65536 |
cha_omaha.img |
51kb(51564位元組) |
1.27:1 |
從表中可以看出,
(1)採用Huffman編碼對上述影象均可以進行壓縮,同時說明在影象中每個亮度值的概率是不均衡的;
(2)對差分影象再用Huffman編碼,可進一步減小檔案大小,說明影象中相鄰畫素之間存在著很強的相關性。
3、利用程式huff_enc和huff_dec,並使用Sensin影象生成的碼本,對Bookshelf1和Sena影象進行編碼。對比原碼錶和此碼錶壓縮影象的情況。
程式執行結果如下:
壓縮情況對比如下:
檔名(壓縮前) |
原檔案大小 |
本碼壓縮大小 |
檔名(壓縮後) |
Sensin碼本壓縮大小 |
Sena.img |
64kb(65536位元組) |
55kb(56623位元組) |
S_sena.img |
101kb(102972位元組) |
bookshelf1.img |
64kb(65536位元組) |
59kb (59667位元組) |
S_bookshelf.img |
90kb(91481位元組) |
從上述結果可以看出,採用不適當的碼錶進行編碼,可能會造成編碼後的檔案增大,這是因為不同影象的亮度值的概率分佈差別可能很大。
相關推薦
有關霍夫曼編碼的兩個習題解答
1、利用程式huff_enc和huff_dec進行以下操作(在每種情況下,利用由被壓縮影象生成的碼本)。 (a)對Sena、Sensin和Omaha影象時行編碼。 (b)編寫一段程式,得到相鄰之差,然後利用huffman對差值影象進行編碼。 (a)執行結果: 影象壓縮情況
霍夫曼編碼
符號 alt 組成 gpo AC width 樹的高度 ace 通信 霍夫曼編碼使用變長編碼表對源符號(如文件中的一個字母)進行編碼,其中變長編碼表是通過一種評估來源符號出現機率的方法得到的,出現機率高的字母使用較短的編碼,反之出現機率低的則使用較長的編碼,這便使編碼之後的
霍夫曼編碼(C++ 優先佇列)
霍夫曼編碼 一般採用字首編碼 -- -- 對字符集進行編碼時,要求字符集中任一字元的編碼都不是其它字元的編碼的字首,這種編碼稱為字首(編)碼。 演算法思想: 構造哈夫曼樹非常簡單,將所有的節點放到一個佇列中,用一個節點替換兩個頻率最低的節點,新節點的頻率就是這兩個節點的頻率之和。這
Huffman樹、霍夫曼編碼
Huffman樹指的是帶權路徑長度WPL最小的二叉樹 Huffman編碼實現: package HuffmanTree; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; impo
基於實現霍夫曼編碼的無失真壓縮-C++實現
一、設計任務 1、把任務十中的文字字元轉為國標碼,計算共需要多少位元。 2、用你所學的方法(霍夫曼編碼、遊長編碼或算數編碼)壓縮這些字元,得到的壓縮碼流共計多少位元。說明資料的冗餘度在哪裡。 3、手動
C++實現霍夫曼編碼檔案壓縮解壓
演算法設計與分析作業,程式碼如下: #include <iostream> #include <map> #include <limits.h> #include <iterator> #include &l
霍夫曼樹和霍夫曼編碼
#include <stdio.h> #include <stdlib.h> #include <cstring> using namespace std; typedef struct HuffNode { int weight;
霍夫曼編碼(Huffman Coding)
霍夫曼編碼(Huffman Coding)是一種編碼方法,霍夫曼編碼是可變字長編碼(VLC)的一種。 霍夫曼編碼使用變長編碼表對源符號(如檔案中的一個字母)進行編碼,其中變長編碼表是通過一種評估來源符號出現機率的方法得到的,出現機率高的字母使用較短的編碼,反之出現機率低的則
C++實現霍夫曼編碼
Huffman類宣告與實現: Huffman.h #ifndef HUFFMAN_H #define HUFFMAN_H #include<vector> #include<string> #include<sstream> struct
霍夫曼編碼c++實現
exit(0); } }演算法2:編碼演算法 ////////////////////////////編碼//value 代編碼的權值//tree 霍夫曼樹//code 編碼結果(01串)bool Coding(int value,const BinaryTree<int&g
哈夫曼編碼(Huffman coding)的那些事,(編碼技術介紹和程序實現)
信號 truct 依次 while 交換 需要 .text 示例 system 前言 哈夫曼編碼(Huffman coding)是一種可變長的前綴碼。哈夫曼編碼使用的算法是David A. Huffman還是在MIT的學生時提出的,並且在1952年發表了名為《
哈夫曼編碼解碼 C++實現
錯誤 urn using 過程 簡單 cin n) struct ren 哈夫曼編碼是一個通過哈夫曼樹進行的一種編碼,一般情況下,以字符:‘0’與‘1’表示。編碼的實現過程很簡單,只要實現哈夫曼樹,通過遍歷哈夫曼樹,這裏我們從每一個葉子結點開始向上遍歷,如果該結點為父節點的
哈夫曼編碼
http sdn chm cstring htc 位數 child 個數 ostream 在電文傳輸中,需要將電文中出現的每個字符進行二進制編碼。在設計編碼時需要遵守兩個原則: (1)發送方傳輸的二進制編碼,到接收方解碼後必須具有唯一性,即解碼結果與發送方發送的電文完全一樣
【BZOJ 4198】[Noi2015]荷馬史詩 哈夫曼編碼
clu tor space zoj col 具體實現 %d sca bool 合並果子加強版....... 哈夫曼樹是一種特別的貪心算法,它的作用是使若幹個點合並成一棵樹,每次合並新建一個節點連接兩個合並根並形成一個新的根,使葉子節點的權值乘上其到根的路徑長的和最短(等價
轉載:哈夫曼樹的構造和哈夫曼編碼(C++代碼實現)
作者 pos blank 字符 element start man null == 作者:qiqifanqi 原文:http://blog.csdn.net/qiqifanqi/article/details/6038822 #include<stdio.h>
【視頻編解碼·學習筆記】7. 熵編碼算法:基礎知識 & 哈夫曼編碼
html 節點 表示 效率 article tchar vector nod code 一、熵編碼概念: 熵越大越混亂 信息學中的熵: 用於度量消息的平均信息量,和信息的不確定性 越是隨機的、前後不相關的信息,其熵越高 信源編碼定理: 說明了香農熵越信源符號概率之間的
哈夫曼編碼大全
cad 節點 pos ada 哈夫曼 描述 多少 一個數 關於 題目: 哈夫曼編碼大全 描述: 關於哈夫曼樹的建立,編碼,解碼。 輸入 第一行輸入數字N,代表總共有多少個字符以及權值 第二第三行分別是一行字符串,以及每個字符對應的權值 接下來輸入一個數M,表示接下來有M
5.2哈夫曼樹——哈夫曼樹與哈夫曼編碼
node i++ insert 編碼 urn all IV right style #include <stdio.h> #include <stdlib.h> struct TreeNode{ int Weight; Huffm
【霍夫曼樹】poj 1339 poker card game
game 霍夫曼樹 printf i++ OS IT amp ostream ++ poj.org/problem?id=1339 #include<iostream> #include<cstdio> #include<string>
word2vec 中的數學原理二 預備知識 霍夫曼樹
append 哈夫曼編碼 har html ant 世界 word2vec tree plus 主要參考: word2vec 中的數學原理詳解 自己動手寫 word2vec 編碼的話,根是不記錄在編碼中的 這一篇主要講的就是