問題描述:圖像壓縮的問題我們是這樣理解的:大家都知道計算機的圖像是用灰度值序列來表示的{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