s1081423 作業6
一、作業說明
件中為三張利用將晶片高度以色彩視覺化後的圖片。
請設計一個基於 Run-Length 的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。並計算三張圖的平均壓縮率 (compression ratio)。
二、程式功能
使用者選擇模式(0、1),模式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解壓縮 : 先建立與原圖相同大小的空影像,同時使用兩個整數rowIdx與colIdx紀錄當前的像素座標,根據compressedData來進行填值。最後回傳影像(oriImg)以進行儲存與顯示。
圖二、空影像建立與填寫像素值
(5)儲存解壓縮影像、計算壓縮率 : 將解壓縮獲得的影像儲存,檔名前綴為” decompressed_”,並使用imwrite()進行儲存。接著讀取原圖與壓縮檔案計算壓縮率
留言
張貼留言