s1093345 作業6
作業說明
- 主題:Run-Length Based Image Compression 練習
- 附件中為三張利用將晶片高度色彩視覺化後的圖片。請設計一個基於Run Length 的壓縮方法,對圖檔座無失真壓縮後儲存成新檔案。部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率。



圖一、Input Image
開發環境
- macOS 13.2.1
- Visual Studio Code 1.77.3
- Python 3.8.3
- OpenCV 4.6.0
- Numpy 1.21.5
實作過程
- 分離圖片的 RGB 通道
- 使用 image.split() 將計算輸入圖片 image 分離 R, G, B 三個通道。
- 透過 np.array() 轉換成 numpy 的數據,並透過 flatten() 展開唯一維數據。
- Run-Length 的編碼
- 簡單說明一下 Run-Length 的編碼方式,假設輸入資料為 [1, 1, 1, 2, 2 ,3 ,3, 3, 3],進行編碼後就變為 [3, 1, 2, 2 ,4, 3],編碼後的數據顯示連續出現的數值及對應的數值。
- 我這邊的實作方式就是透過 for 迴圈去判斷是否有連續且重複的數值出現,去每一個R, G, B的通道進行 Run-Length 的編碼。
- 最終我將我壓縮過後的編碼存成 encoded_image.txt,以方便閱讀。存如的資料有原先圖片的 width, height, encoded R, encoded G, encoded B。
- img1, img2, img3 原先檔案大小為 14.32MB,經上述方法可分別得到 7.88MB, 13.46MB, 7.31MB 的大小。
- 壓縮後還原圖像
- 將先前的壓縮過後的3個通道 R, G, B 編碼數據,把它擴展回去。假設壓縮後的數據 [3, 1, 2, 2 ,4, 3],就將她擴展還原為原本的數據 [1, 1, 1, 2, 2 ,3 ,3, 3, 3]。
- 透過 Image.merge() 義將先前解碼過後的 R, G, B 通道的數據合併為一個圖像,並使用 save() 儲存圖片。
執行結果
- 壓縮率以及壓縮大小
o 圖片讀取:程式碼中的 image_files = [ 'img1.bmp', 'img2.bmp', 'img3.bmp' ]更改所需讀取圖片路徑。
o 執行程式:python 1093345_hw5
影片Demo
影片、程式Demo
留言
張貼留言