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.npz。NPZ格式是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通道透過cv2的split功能分離,並使用np的flatten(),將array攤成一維方便後續run_lengh_encode壓縮。將壓縮後的np array以np.save_compressed功能存成npz檔案。最後回傳圖片的shape。
4. run_length_encode(一維np array data):將剛剛flatten完的np array進行run
length壓縮,壓縮方法如下:
l
若當前格的value與前格不同,便將前格的value及count存入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]讀為count,encoded[i+1]讀為value,並讓list decoded添加 count個value。
將list轉為np.unit8格式,並reshape成原圖片的size(2420*2020),以cv2.merge彙整三維的數值並存檔。
6.caculate_compression_ratio(原圖片,壓縮後檔案):以os庫的os.stat功能來計算兩個檔案的大小,並相除得到壓縮率。輸出結果如圖(左原圖右壓縮檔)。
8.簡單的做一個原圖與解壓縮檔案的比對:使用cv2的absdiff做兩張圖的絕對差異,並判斷是否有非0的位置,有則輸出'Not same',輸出差異處。相同則輸出'Same',
9.前往檔案位置,確認一下實際檔案大小(以第一張圖為例)與輸出檔案縮圖。
留言
張貼留言