算法復習周------“動態規划之‘圖像壓縮’”


問題描述:圖像壓縮的問題我們是這樣理解的:大家都知道計算機的圖像是用灰度值序列來表示的{P1,P2......Pn},其中Pi表示像素點i的灰度值。而通常灰度值的范圍是0~255,因此需要8位二進制數來表示一個像素。這個時候大家應該有了一些小的疑問:我能不能用更少的位數來表示灰度值?(因為有的灰度值並沒有達到255這么大)所以我們引入了圖像壓縮算法來解決這個問題。

 

不過在引入問題之前,我要在這里介紹一些算法設計的知識——我們要將灰度值序列分組,而每一組中所有的數就有可能是<255的,所以我們就不需要用8位數字去表示像素大小了,但是分組會帶來一個新的問題:我如何表示當前組中像素的個數和像素的位數呢(因為不是八位,所以要有一個數據來記錄真正的位數)?這里我們引入兩個固定位數的值來表示,①我們用3位數字來表示當前組的每一位像素的的位數②我們引入8來表示當前組中像素點的個數  因為我們在這里規定了一組中最多存儲-->0~255個數字,而一個灰度值最多有8位(2^3),所以我們可以用即3位數字來表示當前組的像素位數(注意這里都是二進制)

 

算法設計:知道了這些之后剩下的問題就很好解決了。下面我們看一個例子:

 

{6, 5, 7,5, 245, 180, 28,28,19, 22, 25,20}這是一組灰度值序列。我們按照默認的解體方法來看----一共12個數字,所以12*8=96位來表示。

而下面我們將其進行分組:

 

這里我們將他們分為三組:

第一組4個數,最大是7所以用3位表示;

第二組2個數,最大是245所以用8位表示;

第三組6個數,最大是28所以用5位表示;

這個時候,我們最后得到了最后的位數結果為:4*3+2*8+6*5+11*3=91。是不是優化了??

那我們算法應該怎么做來找最優的值呢??

 

下面我一步一步介紹。

 

既然是DP問題,所以我們肯定需要數組來記錄每一步的最優值。這里我們用S[n]來記錄第i個數字的最優處理方式得到的最優解。l[n]中來記錄第當前第i個數所在組中有多少個數。而b[n]中存的數為當前組的像素位數。

 

下面我寫出來具體的遞歸過程-->

例題:  求像素序列4,6,5,7,129,138,1的最優分段。

 

 

 

在解體過程中,我們知道在我們求s[3]的時候,我們是分三種情況----

①前三個數為一組,這個時候我需要的存儲位數是3(位數)*3(每一組中數的個數)+11(每分一組所必須的固定位數)

②s[1]為單獨一組,剩下的兩個數字為一組,此時我所需要的空間為s[1]+2*3+11

③前兩個數字為一組,最后一個數為一組。此時我們要用s[2](前面已經計算出的最優值)+3*1+11

 

然后比較三個數的大小,取最小的那一種分組情況,然后記下l[3]=3(當前最優分組中是三個數在同一組中),b[3]=3(每一個像素所用的存儲位數)。

 

遞歸到最后得到最優解為  58.

之后我們考慮我們的分組情況。這個時候我們就要用到l這個矩陣了。

 l= [1 2 3 4 1 2 3] 在這里我們先從最后一個看,它是3,所以向前推三個數字到了4,在向前推四個數,所以我們得到了這里要分兩組 即 l= [1 2 3 4 | 1 2 3] 。

 

 

寫到這里圖像壓縮問題也就講完了,希望給大家能帶了一些幫助,大家有什么要交流的問題可以給我留言。

 

 

----------------------------------------------------------------------------------------Made By Pinging

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM