2022年6月1日 星期三

s1081545 作業6

 

作業說明:

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)任何色彩值不同,便累計相異的像素數量,並顯示比較結果。若誤選,可明顯看出異色像素極多。





















運行結果:



沒有留言:

張貼留言