ほとんどすべての画像品質の低下は、画像がJPEGとして初めて圧縮されるときに発生します。JPEGが同じ設定で再圧縮される回数に関係なく、世代の損失は丸め誤差に制限されます。
ただし、上記の基準を満たさない反復ごとに丸め誤差が大きくなる場合があり、すべての元のファイルのバックアップを保持することをお勧めします。
色空間を変換します。必要に応じて、色情報をダウンサンプリングします(彩度サブサンプリング)(ロッシー)。ダウンサンプリングされていない場合、情報の損失は丸め誤差の結果です。
セグメンテーション。各チャネルを8x8ブロックに分割します(MCU = Minimal Coding Unit)。 (無損失の)
注:クロマサブサンプリングが有効になっている場合、MCUは元の画像に関して実質的に16x8、8x16、または16x16になる場合があります。ただし、MCUはすべて8x8ブロックのままです。
各MCUの離散コサイン変換(DCT)。情報の損失は、丸め誤差の結果です。
量子化。 MCUの各セルの値は、量子化テーブル(DQT)で指定された数値で除算されます。値は切り捨てられ、その多くはゼロになります。 これは、アルゴリズムの主要な損失部分です。
ジグザグスキャン。各MCUの値を、ジグザグパターンに従って数字のシーケンスに再配置します。量子化中に発生したゼロは一緒にグループ化されます。 (無損失の)
DPCM =差分パルス符号変調。番号シーケンスを圧縮しやすい形式に変換します。 (無損失の)
RLE =ランレングスエンコーディング。連続したゼロは圧縮されます。(無損失の)
エントロピー/ハフマンコーディング。 (無損失の)
JPEGの再圧縮
そのノートカラーチャネル及び量子化をダウンサンプリングすることのみ意図的に非可逆工程です。とりあえず丸め誤差を別にすれば、他のすべてのステップはロスレスです。量子化が行われると、ステップを反転して繰り返すと同じ結果が得られます。つまり、(同じDQTを使用した)再量子化はロスレスです。
原則として、最初のパス後に無損失のリサンプリングアルゴリズムを作成することができます。ただし、ImageMagickの実装では、この画像に見られるように、定常状態に達する前に色が大幅にシフトする場合があります。
最適な条件が与えられた場合、同じ品質設定でJPEGを再圧縮すると、まったく同じJPEGになります。つまり、JPEGの再圧縮は潜在的に可逆です。実際には、JPEGの再圧縮は無損失ではありませんが、丸め誤差の影響を受け、制限されます。が丸め誤差がしばしば最終的にゼロに収束し、全く同じ画像が再作成され、その結果、クロマサブサンプリングは、有意な色の変化をもたらすことができます。
デモンストレーション(同じ品質設定)
bash
ImageMagickを使用して、特定の品質設定でJPEGファイルを繰り返し再圧縮する次のスクリプトを作成しました。
#!/usr/bin/env bash
n=10001; q1=90
convert original.png -sampling-factor 4:4:4 -quality ${q1} ${n}.jpg
while true ; do
q2=${q1} # for variants, such as adding randomness
convert ${n}.jpg -quality ${q2} $((n+1)).jpg
#\rm $((n-5)).jpg # uncomment to avoid running out of space
n=$((n+1))
echo -n "$q2 "
md5sum ${n}.jpg
done
数百回繰り返し実行した後md5sum
、結果を実行しました。
d9c0d55ee5c8b5408f7e50f8ebc1010e original.jpg
880db8f146db87d293def674c6845007 10316.jpg
880db8f146db87d293def674c6845007 10317.jpg
880db8f146db87d293def674c6845007 10318.jpg
880db8f146db87d293def674c6845007 10319.jpg
880db8f146db87d293def674c6845007 10320.jpg
実際、丸め誤差がゼロに収束し、まったく同じ画像が何度も再現されていることがわかります。
さまざまな画像と品質設定でこれを複数回繰り返しました。通常、定常状態に達し、まったく同じ画像が何度も再現されます。
Ubuntu 18.04でImagemagickを使用してmattdmの結果を複製しようとしました。オリジナルはRawtherapeeのTIFFへの生の変換でしたが、もう利用できないようです。その代わりに、私は拡大版を取り、元のサイズ(256x256)に縮小しました。その後、収束するまで75で繰り返し再圧縮しました。結果は次のとおりです(オリジナル、1、n、差):
私の結果は異なります。真のオリジナルがなければ、違いの理由を判断することは不可能です。
90で収束するまで、モンタージュの左上隅から画像を再圧縮しました。これが結果です(元の、1、n、差)。
クロマサブサンプリングを有効にすると、定常状態に達するまでに色が変化します。
少数の設定間で変更する
変数を変更することによりq2
、品質設定を均等に分布した値のセットに制限できます。
q2=$(( (RANDOM % 3)*5 + 70 ))
以下のための選択肢を設定する少数の、平衡は、最終的に到達できる MD5値が繰り返し始めるときに見られます。セットが大きいほど、時間がかかり、平衡に達する前にイメージが悪化するようです。
平衡状態で起こると思われるのは、量子化前のDCT係数がすべての(またはほとんどの)量子値で割り切れなければならないことです。たとえば、DCT係数が3と5で交互に分割される2つのDQTを切り替える場合、DCT係数が15で割り切れるときに平衡に達します。これは、品質の低下が元の設定の差よりもはるかに大きい理由です。
多数の設定間での変更
Eeyoreは次のq2
ように変更された場合、満足しません。
q2=$(( (RANDOM % 9) + 90 ))
ビデオを作成するには、次を使用しますffmpeg
。
rename 's@1@@' 1*.jpg
ffmpeg -r 30 -i %04d.jpg -c:v libx264 -crf 1 -vf fps=25 -pix_fmt yuv420p output.mp4
最初の9999回の繰り返しを見るのは、水の沸騰を見るのとほとんど同じです。再生速度を2倍にしたい場合があります。11999年の反復後のEeyoreは次のとおりです。
MCUの境界が変更された場合はどうなりますか?
変更の回数が限られている場合、再圧縮を繰り返して定常状態に達する可能性があります。各反復で変更が発生した場合、おそらくDQTが変更されたときと同様の方法で画像が劣化します。
編集はどうですか?
編集後の再圧縮の効果は、実行される特定の編集に依存します。たとえば、JPEGアーティファクトを減らした後、同じ品質設定で保存すると、同じアーティファクトが再導入されます。ただし、ヒーリングブラシなどの局所的な変更を適用しても、触れられていない領域には影響しません。
画質の最大の低下は、ファイルが指定の品質設定で初めて圧縮されたときに発生します。その後、同じ設定で再圧縮しても、丸め誤差よりも大きな変化は生じません。そのため、同じ品質設定で保存された他の画像のように、特定の品質設定での編集-再保存サイクルが期待されます(MCUの境界がそのままで、クロマサブサンプリングが無効になっている限り)。
それらのビデオはどうですか?
再圧縮されたJPEGでオリジナルを上書きできますか?
すべての元のファイルのバックアップを保持することは賢明ですが、誤って1つのファイルを上書きした場合、損害はおそらく制限されます。クロマサブサンプリングを無効にしてJPEG で作業することも問題ありません。
JPEGは、色ごとに8ビット以上を使用する画像には使用できません。