基於python的二元霍夫曼編碼解碼詳細設計

來源:互聯網
上載者:User

標籤:cheng   檔案讀取   python   ges   margin   height   索引值   讀取   圖片   

一、設計題目

對一幅BMP格式的灰階映像(個人證件照片)進行二元霍夫曼編碼和解碼

二、演算法設計

(1)二元霍夫曼編碼:

①:映像灰階處理:

利用python的PIL內建的灰階映像轉換函式,首先將彩色圖片轉為灰階的bmp映像,此時每個像素點可以用單個像素點來表示。

②:二元霍夫曼編碼:

                                                        程式流程圖:

 

 

詳細設計:

  1. 統計像素點頻率,首先通過python內建的PIL庫的映像像素點讀取函數read()擷取灰階映像的所有像素點,通過迴圈遍曆每個像素點,將每個出現的像素點值以及其次數以索引值對的形式放入到python的字典中。
  2.  

①:首先構造用以表示節點的類,其中每個節點包括一下成員屬性:       

             self.left = left

            self.right = right

          self.parent = parent

         self.weight = weight

            self.code = code

②:遍曆已經儲存好的像素點頻率字典,將圖片中出現的像素點全部定義為葉子節點,通過類的code以及weight來表示對應的像素點值和該像素點出現的次數。

③:此時葉子結點中的權值為亂序,此時依據每個葉子結點的權重所有的葉子結點進行從小到大的排序;

④:每次取權值最小的兩個節點最為要被替換的節點,將這兩個節點的權值進行相加,然後產生新的節點,同時將這兩個節點從葉子結點列表中去除,同時將新產生的節點放入葉子節點列表,同時對列表進行排序;

⑤:重複步驟④,直到列表中還剩下一個節點,此時這個節點便為前端節點。

3.

①:根據已經構造好的二元霍夫曼編碼樹,由葉子節點開始遍曆整棵樹,左邊賦予碼字1,右邊賦予碼字0,每次向下遍曆一次,若節點為非根節點,則依次將碼符號放在碼字左邊,若遍曆到根節點,則將該葉子結點所表示的像素值以及對應編成的碼字放到碼字字典中;

②:重複步驟①,直到所有的葉子節點都有其對應的二元霍夫曼碼字。

③:經過步驟②,此時像素的碼字字典已經產生,此時迴歸到原圖片,根據遍曆原圖片的像素點,依次在碼字列表中尋找其對應的碼字,將所有像素點對應的碼字拼接在一起。

4.此時由於為二元霍夫曼編碼,則編碼結果為01字串,此時為了對資訊量進行壓縮,採用將8個string類似的值轉為一個byte,首先填充編碼結果使其長度為8的倍數,並增加冗餘位元儲存原使編碼結果最後多餘位元的值以及其長度。填充完畢後,只需每次取編碼結果的八位轉為一個byte存入到txt中即可。

(2)二元霍夫曼解碼:

 

詳細設計:

1.每次讀取txt中的一個位元組,將其還原為字串,直到txt中的所有位元組被讀取結束 ,則所得到的字串則為霍夫曼編碼的結果。

2.

①遍曆霍夫曼編碼的結果,根據霍夫曼編碼已經產生的碼字列表,對原始像素點進行還原,並根據還原後的像素點產生原始bmp圖片。

②:對於每一個被遍曆到的字元均在碼字列表中進行尋找,若未找到則加上後續一個字元,繼續尋找;

③:重複步驟③,直到在碼字列表中找到該碼字對應的像素點,將其碼字對應的像素值放入到像素點列表中,重複以上尋找還原像素值的步驟直到所有字串均被遍曆完。

三、模組劃分

(1)二元霍夫曼編碼部分:

①:類:

class node:

    def __init__(self, right=None, left=None, parent=None, weight=0, code=None): 

        self.left = left

        self.right = right

        self.parent = parent

        self.weight = weight

        self.code = code

功能:表示葉子節點的類

 

②:函數:

def picture_convert():

功能:此函數完成彩色圖轉為灰階圖的功能

 

③:函數:

def pin_lv_tong_ji(list):

功能:統計每個像素出現的次數

 

④:函數

def gou_zao_ye_zi(xiang_su_zhi):

功能:此函數主要為產生葉子結點,將每個節點賦予權值與像素值

 

⑤:函數

def sort_by_weight(list_node):

功能:根據每個葉子結點的權重對葉子結點列表進行排序

 

⑥:函數

def huo_fu_man_shu(listnode):

功能:根據葉子結點列表,產生對應的霍夫曼編碼樹

 

⑦:函數

def er_yuan_huo_fu_man_bian_ma(picture):

功能:此函數為進行二元霍夫曼編碼的主函數,通過對其他函數的調用完成對像素點的編碼

 

⑧:函數

def zi_jie_xie_ru():

功能:由於霍夫曼編碼結果為string類型,此時應將其轉為byte儲存,此函數完成將編碼結果的位元組存入

 

(2)二元霍夫曼解碼部分:

①:函數:

def zi_jie_du_qu(qqqq):

功能:根據霍夫曼編碼產生的txt檔案讀取其中的位元組恢複為字串形式的編碼結果

 

②函數:

def er_yuan_huo_fu_man_yi_ma(kuan,gao)

功能:此為二元霍夫曼解碼的主函數,通過調用其他函數來還原原始的bmp映像

四、測試資料

測試採取圖片像素點個數大小兩種bmp圖進行:

圖片1資訊:

名稱:new.bmp

 

大小: 255 KB (261,366 位元組)

像素點個數為: 260288

灰階圖寬為448像素

灰階圖高為581像素

 

圖片2資訊:

名稱:test1.bmp

 

大小:12.7 KB (13,078 位元組)

像素點個數: 12000

灰階圖寬:96像素

灰階圖高:125像素

 

六、測試情況及結果分析:

(一)二元霍夫曼編碼過程:

圖片1測試結果:

程式運行後將會產生霍夫曼編碼錶,並且將最終的編碼結果存入到當前程式運行目錄下的huo_fu_man_compress.txt中

 

由於存入為位元組形式,以txt形式查看會顯示亂碼,屬於正常情況。

 

原始映像大小為255kb,經過霍夫曼編碼最終大小為218kb,大小縮減了接近15%。

 

圖片2測試結果:

由程式運行結果可得出二元霍夫曼遊程編碼結果儲存到

er_yuan_huo_fu_man_youcheng_compress.txt中

 

由於存入為位元組形式,以txt形式查看會顯示亂碼,屬於正常情況。

 

原始圖片大小為12.7kb,編碼結果檔案為9.5kb,大小縮減了接近26%。

 

(二)二元霍夫曼解碼過程:

圖一測試結果:

 

 

 

根據編碼產生的huo_fu_man_compress.txt還原原始bmp圖片並儲存為

er_yuan_huo_fu_man_huan_yuan.bmp

 

還原後的圖片與原始圖片相符合,解碼成功

 

圖片2測試結果:

根據編碼產生的huo_fu_man_compress.txt還原原始bmp圖片並儲存為

er_yuan_huo_fu_man_huan_yuan.bmp

還原後的圖片與原始圖片相符合,解碼成功

結果分析:

       Bmp灰階圖片經過二元霍夫曼編碼後,檔案大小總能夠縮小,即所佔空間減小,即達到了壓縮的效果,壓縮效率會由像素點出現頻率的影響。

等長碼編碼位元的影響。

基於python的二元霍夫曼編碼解碼詳細設計

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.