JPEG をロスレス形式に変換し、品質を損なわずに元に戻すことは可能ですか?

JPEG をロスレス形式に変換し、品質を損なわずに元に戻すことは可能ですか?

たとえば、JPEG 形式で圧縮された画像のロスレス バージョンがあるとします (JPEG 画像を mspaint で開いて BMP として保存すると、このプロセスで一部のメタデータが失われることはわかっていますが、それは問題ではありません)。

それが可能かどうか、また、画質を落とさずに、つまりすべてのピクセルがまったく同じになるように JPEG 形式に戻す方法を知りたいです。

編集:JPEG 画像をロスレス形式に変換しても、品質は向上しないことは十分理解しています。この質問をする理由は、SWF ファイルから抽出した PNG ファイルがあるからです。元々 (SWF ファイル内) オブジェクトは JPEG 画像 + アルファ チャネルで、このファイル サイズは私が持っている PNG ファイルに比べてはるかに小さいです。元の形式 (JPEG + アルファ チャネル) が欲しいのですが、元の SWF ファイルのコピーがもう手元になく (オンラインでも見つけられなかった)、抽出プロセスをやり直すことができません。

答え1

あなたが尋ねているのは、本質的には、JPEG画像のデコード処理を逆にできるかどうかです。これは従来のJPEGエンコーダの意図とはまったく異なります。これを実現するソフトウェアは知りません。画像がエンコードされた後に変形やその他の変更が適用されていない限り、数学的にはこれは可能です*が、プログラム的にはどれほど難しいでしょうか?

最初の問題は色空間です。JPEG はサブサンプルされた (ピクセルのグループでサンプリングされた色) yCbCr を使用しますが、ビットマップは RGB です。これらの色空間間の変換 (およびガンマ調整) で避けられない損失によりノイズが発生します。解決すべき 2 番目の問題は、JPEG がイメージ データをマクロブロック (NxN サイズのサブイメージ) として記録することであり、これはデコーダの出力イメージから推測する必要があります。JPEG 形式とエンコード プロセスの詳細な説明については、こちらをご覧ください。http://www.guillermito2.net/stegano/jsteg/

JPEG のデコード解除:

元の JPEG データの近似値を作成するには、サブサンプリング、マクロブロックのサイズと配置、およびそれらをエンコードするために使用された離散コサイン変換 (DCT) 係数を見つける必要があります。残りは通常の JPEG エンコード プロセスと同じです。思いつく単純な実装の 1 つは、「推測と確認」です。つまり、画像を作成するためにいくつかの一般的な JPEG 実装が使用されたと仮定し、DCT から「JPEG のような」結果が得られる実装が見つかるまで、それらを適用します (通常は高周波数がゼロ)。

その後、係数を微調整して、元の画像(つまり、圧縮された画像のビットマップ)と比較してエラーが最小になるようにします。このプロセスでは、エラーとファイル サイズの間でトレードオフが発生しますが、実用上は十分近くなるはずです。

ソース: 以前の仕事では、個々のフレームに JPEG のようなコーディングを適用する DNx および ProRes ビデオ コーデックを検証していました (デコードされたフレームをソフトウェアで元に戻すことは、非常に興味深く、潜在的に有用なサイド プロジェクトになります)。

* 元の JPEG デコーダーを通過すると同一の出力を生成する入力データのセットが存在します。ただし、デコード処理中に情報が失われているため、再構築が元のファイルのバイト単位のコピー (メタデータを無視) になる可能性は非常に低くなります。

答え2

JPEGは非可逆フォーマットであり、回避する方法はありません。圧縮品質100でも圧縮率は2.6:1のままです(ウィキペディアJPEG)。

いくつかのバリエーションが提案されたロスレスJPEGJPEG 2000 などもあります。しかし、普及しておらず、サポートも非常に貧弱です。

ロスレス形式に変換する方が良いでしょう。 PNG圧縮は行われますが、損失はありません。

答え3

JPEG 画像を任意のエディタで開いて BMP として保存した場合、ファイルで既に利用可能な品質以上の品質は得られません.jpg。これは、低ビットレートの mp3 ファイル (たとえば 128kbps) を などのはるかに優れた形式に変換してflac、何らかの方法で品質が魔法のように回復することを期待するようなものです。そうはなりません。

harrymc さんが言ったように、最初に jpg で画像を保存したときに情報が失われました。この jpg ファイルからその情報を復元する方法はありません。

非可逆圧縮は「破壊的」または「不可逆的」とも呼ばれます。https://en.wikipedia.org/wiki/Lossy_compression

答え4

JPEGに変換すると、情報が失われる可能性が高くなります。そのファイルをBMPに変換すると、JPEGに保存されている情報は保持されますが、BMPをJPEGに戻すと、さらに多くの情報が失われる可能性があります。

関連情報