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