ウェーブレット圧縮は、エンコードされた画像の2次元ウェーブレット分解を使用する画像エンコード方式のクラスの一般名です。 通常、品質の低下を伴う圧縮を意味します。 記事には複雑な数式は含まれません;理論全体は記事の下部にあるリンクから読むことができます。 ここでのみ練習してください!
JPEGの違い
JPEGアルゴリズムは、ウェーブレットアルゴリズムとは異なり、サイズ8 x 8ピクセルの元の画像の各ブロックを個別に圧縮します。 その結果、高い圧縮率では、再構成された画像でブロック構造が顕著になることがあります。 ウェーブレット圧縮では、このような問題は発生しませんが、別のタイプの歪みが現れ、鋭い境界の近くに「ゴーストのような」リップルの形をとることがあります。
このようなアーティファクトは、平均して、JPEGによって作成された「正方形」よりも観察者に目立たないと考えられています。
例
たとえば、同じ
画像をほぼ同じサイズに強く圧縮します。
JPEGを使用して最初に:

(7959バイト)
次に、JPEG 2000ウェーブレット圧縮アルゴリズム:

(7813バイト)
これらの例では、両方のアルゴリズムによって、導入された歪みの性質をすぐに確認できます。 ウェーブレットを使用した圧縮画像は明らかに良く見えます。
別の画像の圧縮の
別の例では、ファイルサイズをそれぞれ3kbに縮小します。

(Jpeg)

(JPEG 2000)
これは何ですか
私が実装した方法は、基本的に、有名な
JPEG 2000ウェーブレット圧縮アルゴリズムの類似物であり、一般的なJPEGに取って代わることはありません。 数年前、私はVisualBasic6.0でそれを宗教化しましたが、特にソースコードを理解するために、ほとんどの聴衆のためにC#で書き直しました。
提示された実装では、JPEG 2000画像圧縮アルゴリズムで使用される離散双直交CDF 9/7ウェーブレットの高速リフティングを使用しました。C実装は
ここからダウンロードでき
ます 。
ここに示されているコードの制限:
コードを膨張させないために、私はどんなサイズのどんなアスペクト比でも画像を圧縮する能力を移しませんでした。 したがって、圧縮できるのは、サイズが256x256、512x512、1024x1024、2048x2048などの正方形の画像のみです。 また、メモリ使用量の最適化を削除し、圧縮で使用される係数でヘッダーファイルを保存/読み取りました。 そうでなければ、コードは再び不当に肥大化するでしょう。
主な圧縮シナリオ:
- ファイルから画像をロードします。
- ダウンロードした画像をRGB値のバイト配列に変換します。
- 結果の色成分を量子化して、RGBをYCrCbに再コーディングします。
- ウェーブレットを適用します。
- 多次元配列を1次元(フラット)配列に変換します。
- 使用可能な手段(GZipなど)で結果のストリームを圧縮します。
提示されたコードの圧縮係数は、サイズが最小の出力ファイルを取得するために選択されますが、何かを見ることができます。
コンプレッサーコード(C#)
私はC#のエースではないので、コード内に標準の.Netメソッドを使用できる場所があるかもしれません。
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; using System.IO.Compression; using System.IO; namespace WaveleteCompression { class wvCompress {
解凍コード
当然、解凍プログラムはすべてを逆の順序で実行します。
上記で書いたように、コードを読みやすくするために、ヘッダーファイルには保存しませんでした。
したがって、run()メソッドでは、デコードされたイメージのサイズとウェーブレットをデコードするための係数がハードコードされます。
using System; using System.Collections.Generic; using System.Text; namespace WaveleteCompression { class wvDecompress {
C#プロジェクトのソースコード
github参照資料
- ウェーブレット
- ウェーブレット圧縮
- JPEG 2000
- Jpeg
- 離散ウェーブレット変換
- リフティングスキーム
UPD:
ミカノイド :1.149604398、-0.4435068522、-0.8829110762など -特定のポイントでのウェーブレット基底関数の値の係数。 一般的に読む:
リフティングスキーム