0

JPEG 圧縮を読んでいましたが、基本を理解するのに問題があります。このスキーマを参照してください

http://www.cs.cf.ac.uk/Dave/Multimedia/Topic5.fig_29.gif

私の問題は最後のステップにあります。16*16 ピクセルの灰色の画像があると考えてください。したがって、サイズ 8*8 のブロックが 4 つあります。ジグザグ スキャンでは、サイズ 1*64 の 4 つの配列があり、各配列の最初のインデックスは DC 値で、残りの 63 の値は AC コンポーネントです。が似ているとしましょう。

BLOCK-1::150,-1, 6, 0,-3,....
BLOCK-2:-38, 4,-6,-1, 1,....
BLOCK-3:18,-2,3,4,1,....
BLOCK-4:45,3,5,-1,1,....

DPCMが以前の8 * 8ブロックとの違いをエンコードしていることは知っていますが、どうやって?! このようなもの:

150,150-(-38),-38-18,45-18>>
150,188,-156,27

次に、JPEG係数コーディングテーブルによると、

10010110-111110,10111100-111110,01100011-111110,11011-110

また、(たとえば)最初の行(-1、6、0、-3、...)のACコンポーネントについては、RLEを使用するため、次のようになります:

(0,-1),(0,6),(1,-3),...

次に、JPEG のデフォルトの AC コード表によると、次のようになります。

00-0,100-110,111001-10

そして、私の計算が正しければ、次に何が起こるでしょうか?! 最初のブロックの最初の DC を配置し、その後 63 の残りの値の RLE などを配置します。つまり、私たちが持っている最初のブロックのことです 10010110-111110 ,00-0,100-110,111001-10, ...

私は少し混乱していて、答えがどこにも見つかりませんでした:(

4

1 に答える 1

0

まず最初に、C で書かれた小さな JPEG エンコーダーであるjpecを参照することを強くお勧めします(グレースケールのみ、ベースライン DCT ベースの JPEG、8x8 ブロックのみ)。

主な圧縮手順については、こちらを参照してください。特に、現在のブロックのエントロピー コーディング ステップに対応するこの行を参照してください。

DPCM は以前の 8*8 ブロックとの違いをエンコードしますが、どのように?

エントロピー符号化は、ブロックごとに動作します。現在のブロックが空でないと仮定すると、DC 係数のエンコードは、最初に現在の DC 値と以前の DC 値の差を計算することによって行われます。

int val, bits, nbits;
/* DC coefficient encoding */
if (block->len > 0) {
  val = block->zz[0] - s->dc;
  s->dc = block->zz[0];
}

注:sエントロピー コーダーの状態を表します。また、最初のブロックs->dcは 0 に初期化されます。

したがってval、現在の DC 差を表します。

  1. この差のサイズ (= ビット数) は、ハフマン テーブル内の対応する DC コードを読み取ることによってエンコードされます。
  2. 次に、その振幅 (= 値) がエンコードされます。

差が負の場合、2 の補数が使用されます。

bits = val;
if (val < 0) {
  val = -val;
  bits = ~val;
}
JPEC_HUFF_NBITS(nbits, val);  
jpec_huff_write_bits(s, jpec_dc_code[nbits], jpec_dc_len[nbits]); /* (1) */
if (nbits) jpec_huff_write_bits(s, (unsigned int) bits, nbits);   /* (2) */

フルバージョンについては、このコードセクションを参照してください。

于 2014-09-30T08:31:18.743 に答える