s1082046 作業 6
主題: Run-Length Based Image Compression 練習
附件中為三張利用將晶片高度以色彩視覺化後的圖片。
請設計一個基於Run-Length的壓縮法方,對圖檔作無失真壓縮後儲存成新檔案。
部落格上應敘述你的壓縮方法,提供壓縮檔之格式,並計算三張圖的平均壓縮率
一、 開發環境:
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: 遍歷原圖陣列每一rows和cols,並設定pixel為
當pre_pixel==pixel: count++
當pre_pixel!=pixel: 將count、pre_pixel內容依次存入 Mat compress_img,再將count設回1、
設定 pre_pixel = pixel
Step3: 回傳 compress_img,即壓縮後圖片
四、 結果:
圖一、 img1.bmp壓縮前後檔案大小比較
留言
張貼留言