2022年6月1日 星期三

s1083303 作業6

 

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,則壓縮出來的檔案如下:

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。




 

沒有留言:

張貼留言