s1061637 作業6



 

主題 Run-Length Based Image Compression 練習

作業要求:附件中為三張利用將晶片高度以色彩視覺化後的圖片。

請設計一個基於 Run-Length 的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。

部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率

(compression ratio)

開發環境:

  • Windows 11
  • Vscode
  • python
  • Open CV 4.7

作業步驟說明:

1. 導入需要的程式庫。


2. main function中先行寫好要讀入的圖片路徑與規畫要完成的步驟。

l   將三張欲讀入的圖片路徑存為image_paths,壓縮後的檔案命命名為compressed_img.npzNPZ格式是NumPy的壓縮存儲格式,是壓縮的二進制文件,其內容由數個NumPy數組組成。

NPY format ref: numpy.lib.format — NumPy v1.24 Manual

l   將解壓縮後的圖片儲存為img_de.bmp,方便後續比對。

l   對每一張圖片都進行以下操作:將檔案進行壓縮,並透過compressed_files function一邊壓縮文件,一邊暫時存起檔案的size,以方便後續解壓縮時reshape

l   deccompress_image function對剛剛壓縮完的檔案進行解壓縮,

l   計算壓縮率,並將三張圖片的壓縮率進行加總,最後除以三獲得平均壓縮率,在螢幕上顯示平均壓縮率。


3. compress_img(圖片路徑,輸出名稱):按照路徑讀入圖片並存起圖片的shape。將圖片的bgr通道透過cv2split功能分離,並使用npflatten(),將array攤成一維方便後續run_lengh_encode壓縮。將壓縮後的np arraynp.save_compressed功能存成npz檔案。最後回傳圖片的shape


4. run_length_encode(一維np array data):將剛剛flatten完的np array進行run length壓縮,壓縮方法如下:

l   若當前格的value與前格不同,便將前格的valuecount存入encoded_data中。若當前格value與上格value相同,則將count+1。若為最末位則直接存入當前結果。最後回傳encoded_data

l   註解的部分為確認是否count總和為原data大小,輸出結果正確(total=2420*2020=4888400)



5.   decompress_image(壓縮後檔案路徑,解壓縮後圖片路徑,原圖的shape):讀入壓縮檔,並分別存取三個array值,創立空list來存取解壓後array的數值。對三個壓縮array都進行相同操作,兩兩一讀取,將encoded[i]讀為countencoded[i+1]讀為value,並讓list decoded添加 countvalue

list轉為np.unit8格式,並reshape成原圖片的size(2420*2020),以cv2.merge彙整三維的數值並存檔。



6.caculate_compression_ratio(原圖片,壓縮後檔案):以os庫的os.stat功能來計算兩個檔案的大小,並相除得到壓縮率。輸出結果如圖(左原圖右壓縮檔)


7.最後計算結果:


8.簡單的做一個原圖與解壓縮檔案的比對:使用cv2absdiff做兩張圖的絕對差異,並判斷是否有非0的位置,有則輸出'Not same',輸出差異處。相同則輸出'Same',結果都相同,確認可以進行檔案壓縮與解壓縮,獲得與原圖相同的圖。



9.前往檔案位置,確認一下實際檔案大小(以第一張圖為例)與輸出檔案縮圖。





















留言

這個網誌中的熱門文章

rzwang Homework #1

s1101438 Homework #1

s1093309 作業6