ビットマップ
ビットマップ(BMP)は、本質的に説明するもので、ピクセルの色を表す数字の配列です。例えば
1、1、1、0、1、1、1、1、1、1、1、1
ロスレス圧縮
次に、圧縮スキームを定義しましょう。圧縮スキームでは、数値のペアの配列があります。例えば
3、1、1、0、7、1
さて、最初に指摘したいのは、この圧縮スキームが最初の配列と同じピクセルを表すということです。最初の配列には3つの1があり、その後に1つの0が続き、7つの1が続きます。そして、それが私たちがここで表現していることです。この形式は、2つの数字で複数のピクセルを表すため、短くなります。ビットマップ形式では、ピクセルごとに1つの数値を使用する必要があります。
明らかに、これはイメージの単純化されたビュー(たとえば、1行だけ)と圧縮スキームです。ただし、これにより、圧縮スキームが画像の形式をどのように変更するかを確認できます。これが、GIFとBMPの関係です。GIFは、この単純なスキームではなく、Lempel-Ziv-Welchと呼ばれる圧縮スキームを使用します。
ここで説明したのは、ロスレス圧縮方式です。ロスレス圧縮方式の問題は、入力によっては、エンコードされた形式が元の形式よりも長くなる可能性があることです。例えば
1、0、1、0、1
エンコーディングは
1、1、1、0、1、1、1、0、1、1
まあ、それは役に立たなかった。入力を2倍にしました。
別のロスレス圧縮
次に、別の圧縮スキームを考えてみましょう。この1つでは、イメージをオーバーレイされた円として表します。各円について、中心、半径、色を定義します。
最初のビットマップは次のようになります
5、5、1、3、0、0
これは、最初の圧縮方法と同じ長さです。
そして、私たちの2番目は
2、2、1、2、1、0、2、0、1
これは中央の要素を中心とする3つの円です(コンピューターのカウントでは0からカウントを開始するため、コンピューターのカウントでは2です)。1つの円には半径2と色1があります。次に、色0と半径1の円を追加します。最後に、色1と半径0の円があります。
1、1、1、1、1
1、0、0、0、1
1、0、1、0、1
または
2、2、1、1、0、0、3、0、0
これは同じ初期円ですが、2つの点の円で覆われています。ステップでは、それは
1、1、1、1、1
1、0、1、1、1
1、0、1、0、1
これらはどちらも、最初にエンコードされたバージョンよりも短いですが、元のバージョンよりも長くなっています。
なぜ範囲ではなく円について話しているのか疑問に思うかもしれません。主な理由は、円が実際の2次元画像が使用するものに近いためです。
非可逆圧縮
また、非可逆圧縮方式の概念もあります。これらのロスレス圧縮スキームは、元のビットマップ配列に戻すことができます。非可逆圧縮方式は可逆的ではない場合があります。
circlesメソッドの損失の多いバージョンを考えてみましょう。これでは、単純なルールを使用します。半径が1未満の円は保存しません。したがって、最後の2つのエンコードでは、代わりに
2、2、1、2、1、0
そして
2、2、1
再びピクセルに変換されるのは
1、0、0、0、1
そして
1、1、1、1、1
最初のバージョンは、元のバージョンより1つだけ長い要素です。2番目のバージョンは短くなっています。両方とも有効なので、アルゴリズムは両方を自由に開発し、短い方を選択します。
私たちは、より制限されたルールを持つ画像を低品質であると説明します。
円形の形状のオーバーレイされたコレクションとしてのこの画像の表現は、Joint Photographic Experts GroupまたはJPEG形式の仕組みに似ています。その形状は円ではなく楕円ですが、考え方は似ています。単純な方法ではなく、離散コサイン変換を使用して画像をエンコードします。
GIFとは異なり、JPEGは実際には画像を表現する異なる方法です。GIFはまだピクセルです。それらは異なる方法で保管されているだけです。JPEGは形状です。JPEGを表示するには、図形がピクセルに変換されるのは、それが画面の仕組みだからです。理論的には、この方法では機能しないスクリーンを開発できました。ピクセルの代わりに、JPEG形式によりよく一致する形状を作成できます。もちろん、その画面はビットマップを表示できません。BMPまたはGIFを表示するには、JPEGに変換する必要があります。
標準のGIF、たとえば300x300ピクセルを変換してJPEGに変換し、品質を下げると、使用する基本図形が表示されるはずです。多くのJPEGは、はるかに高い解像度の画像から開始することにより、これらのアーティファクトを回避します。
JPEGはピクセルではなく形状であるため、うまくスケーリングします。したがって、8000x8000の画像から始めてJPEGに変換し、300x300の画像として表示すると、失われた細部の多くはとにかく失われます。8000x8000ビットマップを最初に300x300ビットマップに変換してからJPEGに変換すると、多くの場合、結果の品質が低下します。
MPEG
静止画像について話してきました。動画専門家グループやMPEG形式はJPEGと圧縮の同じ種類を使用していますが、それはまた、他の何かを行います。ビデオを実行する簡単な方法は静止画像のシーケンスを送信することですが、MPEGは実際にフレームを送信し、その後、いくつかのフレームが変更をリストし、終了フレームで終了します。ほとんどのフレームは前のフレームに似ているため、変更のリストは多くの場合、2番目の画像よりも小さくなります。
通常、シーケンスはそれほど長くはありません(5フレームなど)。ただし、そうしないとストリームを小さくすることができます。
簡素化
私はたくさん無視しました。私の画像は2色(1ビット)のみで、8ビット画像の256色ではなく、32ビット画像の4,294,967,296色でもありません。8ビットの画像であっても、画像に異なるパレットを選択できることが多いことに注意してください。そのため、同じシーケンスを持つ2つの8ビットビットマップは、外観が異なる(同じ形状でも色が異なる)イメージを表す場合があります。
私の画像は二次元ではなく一列です。ほとんどの画像には特定の行サイズが保存され、配列が2次元になります。
私は実際のエンコーディングをまったく表現しようとしませんでした。それらは、私が使用した単純なものよりもはるかに複雑です。この投稿でエンコーディングを説明できるようにしたかったため、これを行いました。Lempel-Zivをもっと複雑なLempel-Ziv-Welchの改良よりも1つの答えで説明できるとは思いません。そして、私はフーリエ変換を十分に理解していないので、それらをいつでも説明できます。
これは、実際の画像処理の非常に単純化されたバージョンです。しかし、私は教訓的な目的のために、それは本質的なポイントにまだヒットしながら、より複雑な現実よりも理解しやすいと感じています。