作業說明:
Run-Length
Based Image Compression練習
附件中為三張利用將晶片高度以色彩視覺化後的圖片。
請設計一個基於Run-Length的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。
部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率(compression ratio)。
開發環境:
· Windows 10
· Visual Studio 2013
· C#
實作方法:
1. 讀取bmp測試影像檔案,並將所有像素的(R, G, B)三色彩各別擷取出,並存放於不同陣列中。
2. 針對各顏色陣列,進行run-length encoding,分別以(ClrValue, Length)成組方式記錄。因ClrValue介於[0, 255],可用1 byte儲存,而Length可能超過255,將以255*N+Rem方式,用N+1 bytes來記錄。例如,顏色35的長度為798,本系統將以35, 255, 255, 255, 33方式,以5 bytes來記錄,以取代原先所需的798 bytes。編碼過程中,同時累計該顏色所需的byte總數(TotalByteclr)。
3. 本系統以.rle (Run-Length
Encoding)作為壓縮檔的預設副檔名,壓縮格式如下ImgWidth(4-byte),
ImgHeight(4-byte), TotalBytered(4-byte), [Run-Length Codes]red,
TotalBytegreen(4-byte), [Run-Length Codes]green,
TotalBytered(4-byte), [Run-Length Codes]blue。
4. 計算壓縮率時,則不考慮BMP的檔頭,純粹以Pixel Data的儲存所需Byte數目來計算。
5. 解壓縮時,則利用上述的壓縮格式,解析壓縮檔案,並將各像素值還原,並以完整影像方式呈現。
6. 利用比較兩影像的各像素的顏色,只要(R, G, B)各顏色分量有任何差異,該像素即屬不同像素值,可用以驗證解壓縮還原後的影像與原輸入影像是否完全相符,驗證利用Run-length encoding可做到無失真(lossless)壓縮。
壓縮格式:
ImgWidth(4-byte),
ImgHeight(4-byte),
TotalBytered(4-byte), [Run-Length Codes]red,
TotalBytegreen(4-byte), [Run-Length Codes]green,
TotalBytered(4-byte), [Run-Length Codes]blue
壓縮率計算:
執行結果:
1. 程式執行後,介面如下。
2. 按下『Load』鈕讀取測試影像後,再按『Run-Length Encoding』鈕,將影像進行壓縮並存成自定義的.rle檔。壓縮完成後,會於此button下方自動顯示壓縮率;右側影像框中也會自動顯示原影像的各色彩分圖(Red, Green, Blue)。
三個測試檔案的壓縮率結果如下:
Image Files | Compression Ratio |
Img1.bmp | 6.755342 |
Img2.bmp | 4.081053 |
Img3.bmp | 7.079473 |
平均壓縮率:5.970736
三個測試檔案與壓縮檔的檔案大小比較如下:
Image
Files (Size) |
RLE
Files (Size) |
Size
Ratio |
Img1.bmp
(14,665,254) |
Img1.rle
(2,170,924) |
6.755305 |
Img2.bmp
(14,665,254) |
Img2.rle
(3,593,504) |
4.081045 |
Img3.bmp
(14,665,254) |
Img3.rle
(2,072,576) |
7.075858 |
3. 按下『Run-Length Decoding』鈕,則可選取.rle壓縮檔,進行解壓縮,並將解壓結果顯示在右側影像框中。可按『Save』鈕將解壓結果影像另存成.bmp檔。
4. 按下『Check Difference』鈕,可任選兩張.bmp圖檔(原影像與解壓縮後影像),自動進行所有像素的色彩比對,只要(R,G,B)任何色彩值不同,便累計相異的像素數量,並顯示比較結果。若誤選,可明顯看出異色像素極多。
運行結果:
沒有留言:
張貼留言