s1081423 作業6

 一、作業說明

件中為三張利用將晶片高度以色彩視覺化後的圖片。

請設計一個基於 Run-Length 的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。並計算三張圖的平均壓縮率 (compression ratio)


 

二、程式功能

使用者選擇模式(01),模式0為讀取原圖並進行壓縮,1為解壓縮、顯示、儲存還原影像,及顯示壓縮率。由壓縮三張圖像獲得的壓縮率,計算出平均壓縮率:

(49.3078% + 15.615% + 51.6707%) / 3 = 38.8645%

原始影像與壓縮檔案大小比較

程式使用範例與將獲得的檔案如下:




 

三、開發環境

    Windows 10

    Visual Studio 2022

    OpenCV 4.7.0

 

四、實作討論

前情提要 : 介紹本次使用run-length無失真壓縮方法對影像進行壓縮,作法為將重複的連續符號,改為使用精簡的兩個符號表示,作法範例如下

aaaabbcabcbbbaaaa à a4b2c1a1b1c1b3a4

由此可知,在使用run-length進行影像壓縮之前,需要先進行Burrows–Wheeler Transform盡量將相同符號靠在一起,否則可能在進行run-length後反造成檔案變大。而本次作業所使用的影像本身已具備連續符號靠近的前提,因此本次將純粹實施run-length作法。

 

(1)run-length影像無失真壓縮 : 先建立RunLength物件格式,並且以vector<RunLength> compressedData來儲存影像壓縮檔案的資料。其中RunLength的設定如下:

圖一、物件格式

以兩個for迴圈搭配img.at來遍歷影像中的所有像素,若當前的像素值與前面的像素值相同,則count++,否則執行compressedData.push_back()

 

(2)儲存壓縮影像 : 接收為vector<RunLength>的壓縮影像資料,使用ofstream outputFile(savedFileName, ios::binary)執行二進制寫檔,儲存檔名為”compressed_”+ 原影像名,副檔名為.bin

 

(3)讀取壓縮影像 : 讀取bin檔,將內部資料儲存在vector<RunLength> compressedData並且傳送給執行run-length解壓縮的函式。

 

(4) run-length解壓縮 : 先建立與原圖相同大小的空影像,同時使用兩個整數rowIdxcolIdx紀錄當前的像素座標,根據compressedData來進行填值。最後回傳影像(oriImg)以進行儲存與顯示。

圖二、空影像建立與填寫像素值


(5)儲存解壓縮影像、計算壓縮率 : 將解壓縮獲得的影像儲存,檔名前綴為 decompressed_”,並使用imwrite()進行儲存。接著讀取原圖與壓縮檔案計算壓縮率

圖三、計算壓縮率

留言

這個網誌中的熱門文章

rzwang Homework #1

s1093350 Homework #2

s1091537 Homework #1