作業說明:
附件中為三張利用將高度以色彩視覺化後的圖片。請設計一個基於Run-Length的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。
開發環境:
Window 10
Anaconda
VScode
Python
運行說明:
先利用f.seek(14),因為bmp的前14格資料我們用不到,再來利用f.read(40)將標頭資訊擷取出來,再來用while將剩下的資料利用f.read(3)讀出並依據RGB存入對應的list中,讀完後利用np.array(list)將list轉換為numpy array並使用cv2.flip進行圖片的上下左右反轉。接下來使用RLE的方法先對每一列中的元素進行壓縮,再將重複的列進行合併,之後輸出成dat檔,格式為
header: 圖片長、寬
data: R : 列重複次數、[[顏色編碼、出現次數]、[顏色編碼、出現次數]......]
G : 列重複次數、[[顏色編碼、出現次數]、[顏色編碼、出現次數]......]
B : 列重複次數、[[顏色編碼、出現次數]、[顏色編碼、出現次數]......]
之後再將剛剛輸出的dat檔重新讀入,並且利用長寬資訊進行解壓縮,將還原出的檔案儲存起來。
** 假設檔案名稱為 img1.bmp,則壓縮完的檔案名稱將為img1_ecoding_output.dat,再次解壓縮的圖片檔案名稱為img1_decoding_output.bmp
平均壓縮 : (4.5713373763166294286626236833706 + 2.741916969581021618519227090109 + 4.7789263087695898632877625875292) / 3 = 4.0307268848890803034898711203363
結果畫面:
img1.bmp
(壓縮率: 14322/3133 = 4.5713373763166294286626236833706)
img2.bmp
(壓縮率: 14322/5227 = 2.741916969581021618519227090109)
img3.bmp
(壓縮率: 14322/2999 = 4.7789263087695898632877625875292)
沒有留言:
張貼留言