16

私は MATLAB を初めて使用しますが、グレースケール イメージのイメージ圧縮コードを実行しようとしています。

質問

SVD を使用して値の低い固有値を削除し、圧縮された画像を再構築するにはどうすればよいですか?

これまでの作業/試行

これまでの私のコードは次のとおりです。

B=imread('images1.jpeg');   
B=rgb2gray(B);  
doubleB=double(B);  
%read the image and store it as matrix B, convert the image to a grayscale
photo and convert the matrix to a class 'double' for values 0-255  
[U,S,V]=svd(doubleB);

これにより、変数 S に格納された固有値を使用して画像行列を正常に分解できます。

S (167x301、クラス double) を切り捨てるにはどうすればよいですか? 167 個の固有値のうち、上位 100 個 (または実際には任意の n 個) のみを取得したい場合、どのようにそれを行い、圧縮された画像を再構築しますか?

更新されたコード/考え

コメント セクションに大量のコードを入れる代わりに、これが現在のドラフトです。N を手動で変更することで圧縮イメージを正常に作成できましたが、さらに 2 つのことを行いたいと考えています。

1-さまざまな圧縮の画像のパネルを表示します(つまり、N = 5、10、25などのループを実行します)

2- それぞれの画像と原画の差分(誤差)をなんとか計算してグラフ化。

ループと出力を理解するのは恐ろしいですが、これは私が試したことです:

B=imread('images1.jpeg');  
B=rgb2gray(B);  
doubleB=im2double(B);%  
%read the image and store it as matrix B, convert the image to a grayscale  
%photo and convert the image to a class 'double'  
[U,S,V]=svd(doubleB);   
C=S;  
for N=[5,10,25,50,100]  
C(N+1:end,:)=0;  
C(:,N+1:end)=0;  
D=U*C*V';  
%Use singular value decomposition on the image doubleB, create a new matrix  
%C (for Compression diagonal) and zero out all entries above N, (which in  
%this case is 100). Then construct a new image, D, by using the new  
%diagonal matrix C.  
imshow(D);  
error=C-D;  
end

複数の写真を取得していないか、エラーマトリックスを「グラフ化」する方法を知らないため、明らかにいくつかのエラーがあります

4

4 に答える 4

12

はじめに、SVDは単一の画像のピクセルを非相関化するための最良のツールではないことをご存知だと思います。しかし、それは良い習慣です。

OK、それで私たちはそれを知っていB = U*S*V'ます。そして、Sは対角線であり、大きさでソートされていることがわかります。したがって、Sの上位のいくつかの値のみを使用することにより、画像の近似値を取得できます。たとえばC=U*S2*V'、S2は変更されたSです。UとVのサイズは変更されていないため、今のところ最も簡単な方法は、使用したくないSの要素をゼロにして、再構築を実行することです。(これを行う最も簡単な方法:) S2=S; S2(N+1:end, :) = 0; S2(:, N+1:end) = 0;

次に、圧縮部分について説明します。 Uがいっぱいで、もそうなのでV、何が起こってもS2データ量は変わりません。しかし、何が起こるかを見てくださいU*S2。(画像をプロットします)。N個の特異値をに保持した場合S2、の最初のN行のみS2が非ゼロになります。圧縮!あなたがまだ対処しなければならないことを除いてV(U*S2)の多くはそれ自体U*S2よりも非ゼロであるため、すでに実行した後で同じトリックを使用することはできませんS2。どうすれば両側でS2を使用できますか?まあ、それは対角線なので、、D=sqrt(S2)そして今を使用してC=U*D*D*V'ください。したがって、現在U*DはN個の非ゼロ行のみがあり、N個のD*V'非ゼロ列しかありません。それらの量だけを送信すると、ほぼBに似たCを再構築できます。

于 2012-11-28T22:14:59.357 に答える
0

最初の n max 個の固有値とそれに対応する固有ベクトルを取得すると、問題が解決する場合があります。PCA の場合、元のデータに最初の昇順の固有ベクトルを乗算すると、nxd によって画像が作成されます。ここで、d は固有ベクトルの数を表します。

于 2012-11-28T21:46:20.117 に答える