たとえば、JPEG圧縮に関する最近の会話では、2つのJPEG(1つは圧縮レベル100、もう1つは圧縮レベル95)の間で変化したピクセルごとに比較したかったのです。
面倒なカスタムソフトウェアプログラミングを行わずに、変化したものの優れた視覚的マップを生成するにはどうすればよいですか
たとえば、JPEG圧縮に関する最近の会話では、2つのJPEG(1つは圧縮レベル100、もう1つは圧縮レベル95)の間で変化したピクセルごとに比較したかったのです。
面倒なカスタムソフトウェアプログラミングを行わずに、変化したものの優れた視覚的マップを生成するにはどうすればよいですか
回答:
Photoshop +レイヤーFTW。(はい、Gimp、または同じ機能を持つ他の編集ソフトウェアを使用することもできます。)
ベース画像から始めます。上記の場合、jpeg品質の100画像を使用しました。
結果の画像では、2つの画像間で何らかの違いがあるピクセルは白になります。しきい値を変更することで、「少し違う」ように調整できます。
Lightroomのjpeg 92と100のLOTの違いを示す例。
95と100の間でまったく違いがないことを示す例。
それは単に「変更されたかどうかのない」バイナリを表示しているだけではありません。たとえば、カラーチャンネルごとに、それがどの程度変更されたかの詳細を知りたい場合はどうでしょうか。
結果のピクセルが明るいほど、その色はより大きくなります。マイナス面は、多くの灰色の泥になってしまうことです...そのため、違いがある場所を確認するためにしきい値を設定する方が簡単な場合があります。そのため、両方を作成し、どちらを表示するかを切り替えます。
Photoshopを使用している場合、次のようにします。
2つの別々のレイヤーで、2つのjpegを同じpsdファイルに入れます。寸法が同じであるため、それらは正確に重なり合う必要があります。(どれが上にあるかは関係ありません)。
レイヤーの描画モードを「差分」に設定します。ほとんど黒の結果が表示されます。2つの元のレイヤーの品質の違いによって、多少のノイズが見られる場合があります。
すべての画像処理パッケージでこれが簡単になります。このシステムにアクセスできる場合は、Mathematicaでそれを行う方法を紹介します。Mathematicaはプログラミング言語ですが、この種の操作は非常に簡単です。そのため、アクセスできる場合(大学のサイトライセンスなど)、ぜひ試してみることをお勧めします。
まず、画像をインポートします。
img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]
JPEG圧縮を使用して再圧縮する
img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]
次に、ピクセル値の差を取り、最初にそれらを浮動小数点数に変換して、負の値が保持されるようにします。
diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]
差分画像にはほとんど表示されず(差分は小さい)、負の値は黒にクリップされます。すべての値を再スケーリングして、ダイナミックレンジ全体を埋めます(最小値は0、最大値は1にスケーリングされます)。
ImageAdjust[diff]
ImageDifference
2つの画像の絶対差を与え、負の数は生成しません。これは、画像処理パッケージ、特にGUIパッケージ(Photoshop、GIMP)で見つける可能性が高い操作です。
ImageDifference[img, img2]
また、赤などの単一のRGBチャンネルを使用して、「反対の」色を使用して正と負の違いを視覚化することもできます。
ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]],
ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]
同じことがありますが、違いは5倍に増幅されています。JPEGアーティファクトは、現在より認識しやすくなっています。
ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]],
ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]
プログラミング言語を使用する利点は、これを簡単に自動化し、「圧縮レベル」の違いが0.1と1.0の間でどのように変化するかを確認できることです。
Grid@Partition[Table[
ArrayPlot[
0.5 + ImageData[
First@ColorSeparate[
ImageSubtract[Image[img, "Real"],
Image[ImportString@
ExportString[img, "JPEG", "CompressionLevel" -> c],
"Real"]], "Red"]], ColorFunction -> "RedGreenSplit",
ColorFunctionScaling -> False],
{c, 0.1, 1, 0.1}
], 5]
GitHubには、ここで説明し、このデモで示すように、Web上に興味深い画像差分ツールが組み込まれています。