1、作業說明
附件中為三張利用將晶片高度以色彩視覺化後的圖片。
請設計一個基於Run-Length的壓縮方法,對圖檔作無失真壓縮後儲存成新檔案。
部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率(compression
ratio)。
2、開發環境
- Windows 10
- OpenCv 4.5.5
- Python 3.10.1
3、程式說明
1) 讀取圖像
以imread("[path]")讀取圖像。
2) Run-Length Encoding
Run-Length Encoding規則:
將原圖陣列中的值依照[值, 重複次數, 值, 重複次數...]進行轉換。比如:[1,1,2,2,3,3,3,3,4,4]會轉換為[1,2,2,2,3,4,4,2]。
將輸入影像以cv2.split(img) 拆分成B、G、R三個陣列,並以flatten()將二維陣列拉成一維陣列(將r[1][0]接到r[0][end]後面,再將r[2][0]接到後面...)。並依照上述Run-Length Eecoding方法壓縮。壓縮完成後,將原圖column大小、row大小與壓縮完成的資料以換行符('\n')為間隔存入新檔案中,並輸出壓縮後檔案。
假設有壓縮圖大小row * col = 2040 * 1800,則壓縮出來的檔案如下:
0,2000,3,405,2,10,3,5,2,1,5,6,30,......, //data of array B
52,2000,87,405,2,4,3,5,5,1,3,6,2,......, //data of array G
87,405,2,4,3,5,5,1,3,6,2,25,2000,......, //data of array R
3) Run-Length Decoding
Run-Length Decoding規則:
將壓縮後的值依照Run-Lengh Encoding反向操作,將[值1, 重複次數n1, 值2, 重複次數n2...]轉換成[值1, 值1,...(重複n1次), 值2, 值2,...(重複n2次), 值3...]。比如:[1,2,2,2,3,4,4,2]會轉換回[1,1,2,2,3,3,3,3,4,4]。
以readlines方法讀取檔案,line1為col、row資訊,line2、3、4分別為array B、G、R資訊,讀取到BGR陣列後以','為符號將其分隔並轉回int陣列。
將BGR三個陣列以上述Run-Length Decoding方法解壓縮回原樣。
最後以reshape(rows, cols)將B、G、R轉回二維陣列並以merge([b,g,r])合成回圖片進行驗證(驗證是否相同於未壓縮前)並輸出驗證結果與圖片。
4) 計算壓縮率並輸出
以課堂PPT(chapter08 pp.2) 計算Compression ratio: C = (b' / b),以及計算Relative data redundancy: R = 1 - 1/C 並輸出。
4、執行結果
執行程式後會列出Verify結果(是否與未壓縮前圖片相同)、壓縮前後檔案大小、Compression ratio、以及Relative data redundancy。
沒有留言:
張貼留言