2021年6月6日 星期日

s1073348 影像處理作業 6

 1.作業說明:

附件中為三張利用將高度以色彩視覺化後的圖片。請設計一個基於Run-Length的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。
部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率(compression ratio) 


2.作業環境


作業系統: Windows 10
程式語言:Python 3.8.5
編譯器:Spyder 4
使用python套件:
openCV 4.5.1
numpy 1.20.2


3.操作過程

1.先輸入圖片的名稱,不用加.bmp(ex: 輸入圖片的名稱:  img1)

2. 用兩個for迴圈 ,將 rgb的數值分成三個numpy.array儲存。

3.三個 numpy.array 的單位大小是 uint8 ,也就是 1單位是1byte,而array的長度事先設為
   image[0](長度)*image[1](寬度)。

4.準備另外三個矩陣 單位一樣為 uint8,來儲存 Run-length 壓縮的像素

5.runlength 壓縮後為:0 255 1 255 2 255 75 1 .....
(壓縮格式為:rgb數值+連續的數量+rgb數值+連續的數量…)

6.如果連續的rgb數值大於255 則暫時存到 255 再繼續接著儲存。
(EX:0 255 0 255 0 255 0 255 …)

7. 因為run-length 壓縮的array事先的大小是圖片的pixel大小,但轉為run-length的資料後不需要那麼大,所以把原本的array的大小換成 run-length 資料的長度, 可以有效縮小檔案大小。

8.接著把r g b 分別對應的三個array,轉為binary檔存起來。
    儲存的名稱為 (img_name+'_compress.bin')
   寫入的時候會先寫入 2個 int 值,分別為圖片的長度跟寬度,以方便還原
    而 rgb 三個Run-length array 的長度(3個int)也會寫入

9. RLE 解壓縮時 用  np.zeros((row,col,3),dtype='uint8')  來當作圖片接收 rgb的框架 ,當資料還原      完成 圖片也還原了

10.最後用 cv.imwrite("result_"+ img_name +".bmp",img_n) 將還原結果輸出


4.結果顯示


1.原始圖片 img1

  還原result_img1


2.原始圖片 img2



還原 result_img2



3.原始圖片 img3

還原圖片 result_img3




壓縮比:


若以 MB粗略估計則

img1壓縮比為(13.9/ 2.10) = 6.61

img2壓縮比為(13.9/ 3.45) = 4.02

img3壓縮比為(13.9/2.00) = 6.95

平均 (6.61 + 4.02 + 6.95) / 3 = 5.86
平均壓縮率 17.06%
                    

若以 KB 來估計則

img1壓縮比為(14322 / 2157) = 6.63

img2壓縮比為(14322/ 3544) = 4.04

img3壓縮比為(14322/ 2056) = 6.69

平均 (6.63 + 4.04 + 6.68) / 3 = 5.78

平均壓縮率 17.30%















沒有留言:

張貼留言