s1082046 作業 6

 主題: Run-Length Based Image Compression 練習

附件中為三張利用將晶片高度以色彩視覺化後的圖片。

請設計一個基於Run-Length的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。

部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率

(compression ratio)

一、 開發環境:

l   Windows 11

l   Visual Studio 2022 C++

l   OpenCV 4.7.0

二、 run-length encoding概念:

一種無失真資料壓縮的方式,將原資料串(input data),也就是一連串連續、相同的資料,儲存為數量 + 單一資料,來實現壓縮。

範例

原資料: ABBBBBBBBA

壓縮後資料: 1A8B1A

三、 程式功能:

l   主程式

Step1: 輸入欲壓縮圖片數量 ( cin>>num )

Step2: Step1數量分別輸入欲壓縮圖片檔案名稱 ( cin>>img_name )

Step3: 利用 imread(img_name分別讀入圖像.bmp

並依次放入vector<Mat> src_img  陣列中( push_back() )

        Step4: 將 src_img 陣列中每筆圖片分別進行壓縮(執行副程式 compress_img(Mat img) )

          並將壓縮後圖片存入 vector<Mat> dst_img 陣列中 ( push_back() )

Step5: 利用 imwrite(img_name , dst_img[i]),分別將 vector<Mat> dst_img  

           陣列中壓縮後圖片寫入檔案,存成.bmp

Step6: 利用 tellg() 獲取原始圖片.bmp檔與壓縮後圖片.bmp檔大小

Step7: 計算個別壓縮率(公式: 原圖片檔大小/壓縮後圖片檔大小*100 % )

        Step8: 計算平均壓縮率(公式: 個別壓縮率和/總圖片數量)

l   副程式compress_img(Mat img)

概念詳述請看第二點

Step1: 設定pre_pixel為原圖陣列第一個像素,count = 0

Step2: 遍歷原圖陣列每一rowscols,並設定pixel 

pre_pixel==pixel: count++

pre_pixel!=pixel: countpre_pixel內容依次存入 Mat compress_img,再將count設回1

                                 設定 pre_pixel = pixel

         Step3: 回傳 compress_img,即壓縮後圖片

四、 結果:

圖一、 img1.bmp壓縮前後檔案大小比較


圖二、 img2.bmp壓縮前後檔案大小比較


圖三、 img3.bmp壓縮前後檔案大小比較


圖四、 執行結果(包含個別壓縮率、平均壓縮率)



 

 

 


留言

這個網誌中的熱門文章

rzwang Homework #1

s1093350 Homework #2

s1061637 作業6