1091442 homework#5
學號:1091442 姓名:李衍一
主題: Run-Length Based Image Compression 影像壓縮練習
設計思路:
本次作業參考了Tita’s Blog的影像處理小白(六):Run-Length
Encoding 壓縮圖片這篇文章中的做法,將連續數值的像素其值與連續數量組成字串,並寫入.dat檔內。讀取dat檔時再按照讀取到的數值與連續數量依次回填,即可完整復原圖像。
程式解析:
設置視窗名稱、壓縮檔名稱與平均壓縮率。
ratio_calculate函式會取得原圖檔和壓縮檔的檔案大小,通過相除計算出單張圖片的壓縮率。
Img_compressed函式的目的是壓縮檔案。首先讀入圖片,將圖片的長與寬以write()函式寫入檔案。
若直接檢查RGB整體的值是否重複,可能因某部分值不同而將其分開儲存。大幅減少壓縮效率。在這裡可以將圖片的R、G、B通道分開,一個一個計算重複。對於每個像素檢查與前一個像素是否相同,若相同則累積像素計數增加、不同則將當前像素值及累積像素計數寫入文件,重新設置像素檢驗點重新計數。
在全部檢查完後將剩餘像素也一併寫入,回傳檔案。
接著是將dat檔復原成圖片的unsealed函式。從文件讀入圖片長寬後建立三個通道的陣列。
分別對三個通道復原。在每個通道內兩個兩個值讀取,把像素值放入累積像素數量的座標內,復原出R、G、B三個通道的圖。
將RGB通道合併,即可得到完整復原圖。復原圖片回傳至主程式。
此為主程式部分。將圖片壓縮、壓縮率計算、解壓縮分別對三張圖片實作,再將壓縮率相加除以圖片張數即可得到平均壓縮率。
成果展示:
平均壓縮率:1.6127177979475829
成果反省:
直到這次作業查找資料時,才發現原來有位前輩對這次課程的作業做了詳細解析,之前都沒注意到……這次的作業基本上是照搬他的設計思路來實現。在鑽研過程式碼之後,我發現他的做法很漂亮,以我的能力很難再去作改進了,於是決定延用他的做法。有更漂亮的做法為什麼不用呢?
我從他身上學到的另外一點,是對程式的解析。我在網路上看到的大部分程式都是整段丟上來給人自己trace,我也常採取這種做法。因此在看到作業二的評語「程式碼解釋不完整」時,我完全摸不著頭緒。直到看到他把每段程式碼分別標記出來並仔細講解,我才終於理解該如何解析自己的程式碼。我現在知道那句話是什麼意思了。
這次多虧了這位前輩,我理解了自己的不足,改變了程式解析的做法,讓解釋更加詳盡。
留言
張貼留言