5

特異値分解を使用して特定の画像を圧縮しようとしています。プロセス全体でゴミの色のピクセルが表示され続けることに気付くまで、私はそれを持っていると思っていました。

ごみのピクセル

右上に表示されている数値は、反復回数を示しています。ここで、0は元の画像です。

これは一般的なエラーですか?足りないものはありますか?

それは私の数学そのものに関係しているのではないかと思います。これを処理するJavaマトリックスパッケージであるJAMAを使用しています。以下は、各反復の実装です。

for (int i = 0; i < k; i++) {    
    Matrix step = (uColumns[i].times(sValues[i])).times(vColumns[i].transpose());
    encoded = encoded.plus(step);
}

基本的に、私がしている(またはしようとしている)ことは次のとおりです。

M = M + (s1*u1*v1^t)

私の実装に明らかに何か問題がありますか、それともJAMAがSVDを実行する方法が原因である可能性がありますか?私がテストしたところによると、行列UとVの値の符号は、WolframalphaまたはMatlabによって生成されたものとはいくつかの行で異なります。

どんな助けでも大歓迎です。

ありがとう、

ユスティニアヌス

4

1 に答える 1

3

これは原色に分解された画像です。

Lena SVD を RGB に分解

どうやら、色を数値に変換したり、数値を色に変換したりする方法が間違っているようです。int RGB ピクセルを単一の数値として扱い、それを SVD 数値プロシージャに渡しますが、実際には RGB であるという情報は失われます。

ほとんどの非可逆画像圧縮方法は、重要度の低いビットを破棄することによって圧縮を実現しています。ただし、単一のintに RGB がある場合、各 R、G、および B の重要度の低いビットが重要度の高いビットでインターリーブされます。ピクセルを単一の数値として渡す場合、この情報は失われ、SVD 手順は重要度の低い R ビットを重要度の高い G ビットよりも重要であると効果的に解釈し、すべての G および B ビットを完全に破棄しようとする場合があります。 R ビットの「後」に格納されます。

たとえば、明るい灰色のピクセル (192,192,192) の RGB 値は 0xC0C0C0 です。この値を 1% の誤差で圧縮すると、たとえば 0xC2AE32 が得られます。圧縮アルゴリズムの観点からは、この値は元の値よりわずか 1% 大きいだけで、ほとんど目立ちません。しかし、これを RGB に戻すと (194,174,50) になります。R コンポーネントは確かにほとんど同じですが、G と B は破損しています。これは、プログラムの「ガベージ カラー」の原因です。分解されたイメージは、R コンポーネントが正しく圧縮されていることを示しています。G コンポーネントは高圧縮レベルでランダム ノイズになり、B コンポーネントは常にランダムです。

実装におけるもう 1 つの問題は、単一の明るいピクセルが暗い領域に散らばっていることです。これらは明らかに数値のオーバーフローとアンダーフローが原因です。たとえば、黒のピクセル (0,0,0) は 0x000000 = 0 としてエンコードされます。非可逆圧縮では、正または負の小さなエラーが発生する可能性があり、-1 = 0xFFFFFFFF になる可能性があります。RGBでは(255,255,255)となり白になります。

何をすべきか?

SVD 画像圧縮をテストしているだけで、グレースケール画像を使用するだけで十分な場合は、0 から 255 の範囲にある RGB 値から下位バイトを取得する必要があります。これに応じて、結果を表示するとき、または出力ファイルを書き込むとき、この値をグレースケールとして解釈するか、0x010101 を掛けて完全な RGB 値を取得します。

カラー イメージを圧縮する必要がある場合は、SVD アルゴリズムを R、G、および B コンポーネントに対して個別に実行する必要があります。これは色を処理する最も簡単な方法ですが、最も効率的な方法ではありません。圧縮率を高めてアーティファクトを目立たなくするには、RGB から Lab (ルミナンスと 2 つのクロミナンス チャンネル) に変換することをお勧めします。クロミナンスはさらに圧縮できます。これが JPEG の仕組みです。

画像を解凍するとき、SVD から値を計算した後、それらを画面に表示する前、またはファイルに書き込む前に、結果のすべての値 (R、G、および B) を 0 ~ 255 の範囲にクランプします。これにより、散在する白い点がなくなります。

于 2012-11-20T10:15:07.600 に答える