1

512x512 の画像があり、それを再圧縮しようとしました。画像を jpeg ファイルに再圧縮する手順は次のとおりです。

    1) convert rgb to YCrCb
    2) perform down sampling on Cr and Cb
    2) convert YCrCb to DCT and Quantized according to chosen Quality
    3) perform Huffman Encoding on Quantized DCT

しかし、ハフマン エンコーディングの前に、DCT 係数の数を数えたところ、393216 でした。これを 64 で割ると、DCT ブロック (8x8) の数がわかり、6144 になります。

次に、ピクセル ドメインの 8x8 ブロックの数を数えてみました。512/8=64 とすると、水平方向に 64 ブロック、垂直方向に 64 ブロックになります。ピクセル数が 512x512 = 262144 であるのに対し、64 x 64 = 4096 は DCT ブロックの数と等しくありません

私の質問は、ハフマン エンコーディングが魔法のように 393216 係数を 262144 ピクセルに変換し、各ピクセル値を取得し、圧縮画像 (jpeg) の寸法 (512x512) を計算する方法です。

よろしくお願いします。:D

4

3 に答える 3

2

イメージがカラー サブサンプリングなしでエンコードされた場合、8x8 係数ブロックと 8x8 カラー コンポーネント ブロックの比率は 1:1 になります。各 MCU (最小符号化単位) は 8x8 ピクセルで、3 つの 8x8 係数ブロックがあります。512x512 ピクセル = 64x64 8x8 ブロック x 3 (Y、Cr、Cb ごとに 1 つ) = 12288 係数ブロック。

色をサブサンプリングしたと言ったので(両方向であると思います)、MCUごとに6つの8x8ブロックができます。以下の図で、左端の図は色のサブサンプリングがない場合を示し、右端の図は両方向のサブサンプリングを示しています。この場合の MCU サイズは 16x16 ピクセルになります。ピクセルの各 16x16 ブロックには、それを定義するために 6 つの 8x8 係数ブロックが必要です (4 Y、1 Cr、1 Cb)。イメージを 16x16 MCU に分割すると、MCU ごとに 6 つの 8x8 ブロックを持つ 32x32 MCU = 6144 係数ブロックになります。したがって、あなたの質問に答えるために、ハフマン エンコーディングは係数の数を変更するものではなく、色のサブサンプリングです。JPEG 画像でカラー サブサンプリングを使用することによる圧縮の一部は、人間の視覚システムの機能を利用しています。

ここに画像の説明を入力

于 2012-02-23T23:40:57.713 に答える
0

画像は 512x512 ピクセルです Y コンポーネントは 512x512 なので、262144 ピクセルが 262144 DCT 係数に変換されます Cb および Cr コンポーネントは 2 でダウンサンプリングされるため、256x256 ピクセルはそれぞれ 65536 DCT 係数に変換されます。すべての DCT 係数の合計は 262144+65536+65536 = 393216 です。ハフマンはこれとは何の関係もありません。

于 2013-03-15T19:19:26.983 に答える
0

ハフマン エンコーディングは、係数をピクセルなどに変換しません。少なくとも、私が考えているハフマン エンコーディングではありません。すべてのハフマン エンコーディングが行うのは、トークンのリストを取得し、それらのトークンの頻度に基づいてより少ないビットでそれらを表現することです。

例: トークン a、b、c、および d があるとします。

現在、圧縮されていない場合、各トークンには 2 ビット (00、01、10、および 11) が必要です。

a=00、b=01、c=10、d=11 としましょう

aabaccda000001001010110016ビットとして表されます

しかし、ハフマンエンコーディングではa、より一般的であるため、より少ないビットで表現し、次の程度まで一般的ではないため、より多くのビットで表現しますbd

a=0、b=110、c=10、d=111 の場合

aabaccda0011001010111014ビットとして表されます

于 2012-02-23T23:44:04.030 に答える