「アルゴリズムの設計と解析」 - 画像圧縮エッセイ

我々は通常、{P1、P2、P3、P4、···、PN}使用されるコンピュータ中国画素グレースケール値シーケンスは、画像です。PIは、画素iの濃淡値を表します。したがって、8ビットの1つの画素を表し、0〜255のグレー値の範囲です。

圧縮された画像は、{P1、P2、P3 ...}分割するM個の連続セグメントS1、S2、... Smの画素配列が与えられます。

対象:画像圧縮の問題は、ピクセルの配列を決定するために必要とされる{P1、P2、P3、... 、PN} 最適セグメンテーション、セグメント順次ように所望の最小記憶容量です。0 <= PI <= 256,1 < = iが= N < 各セグメントの長さは256ビットです。

最適な特性の基礎構造、Lを設定する[I]、B [I ]、1 <= l <= M れる{P1、P2、...、PN}最適なセグメントです。見かけ上、L [1]、B [ 1] は{P1、P2、...、PN}最適セグメント。画像の圧縮特性は、最適なサブ構造を満たしています。

再帰的に最適値を計算します

セグメントの集合Sに必要なビットの最適数を格納[i]は、1 <= iが<= nの画素配列は、{P1、... PN}です。

圧縮アルゴリズム:

static final int lmax = 256;
static fianl int header = 11;
static int m;

public static void compress(int[] p,int[] s,int[] l,int[] b){

int n = p.length-1;
s[0] = 0;
for(int i = 1;i<=n;i++){
b[i] = length(p[i]);
int bmax = b[i];
s[i] = s[i-1] + bmax;
l[i] = 1;
for(int j = 2;j<=i&&j<=lma;j++){

if(bmax < b[i-j+1]) vmax = b[i-j+1];
if(s[i]>s[i-j]+j*bmax){
s[i] = s[i-j]+j*bmax;
l[i] = j;
}
}
s[i]+ = header;
}
}


private static int length(int i){

int k = 1;
i = i/2;
while(i>0){
k++;
i=i/2;
}
return k;
}

最適なソリューションを構築

 

フロントアルゴリズムに圧縮するL [i]は情報及びb [i]は、最適なセグメントのニーズを記録する使用します。実際には、セグメントの長さとセグメント最適画素ビットはで[n]は最後の段落L [n]とBに格納されています。Lの存在[NL [N]と前のセグメントとNL [n]は、アルゴリズム最適解は、以下のように構成されているように、B [画素ビット長:

private static void traceBack(int n int[] s,int[] l){

if(n==0)return;
traceBack(n-l[n],sl);
s[m++] = n-l[n];
}

public static void output(int[] s,int[] l,int[] b){


int n = s.length-1;
m = 0;
traceBack(n,s,l);
s[m] = n;

for(int j = 1;j<=m;j++){
l[j] = l[s[j]];
b[j] = b[s[j]];
}
}

 

おすすめ

転載: blog.csdn.net/qq_40903237/article/details/94600792