matlab練習程序(奇異值分解壓縮圖像)


  介紹一下奇異值分解來壓縮圖像。今年的上半年中的一篇博客貼了一篇用奇異值分解處理pca問題的程序,當時用的是圖像序列,是把圖像序列中的不同部分分離開來。這里是用的不是圖像序列了,只是單單的一幅圖像,所以直接就對圖像矩陣進行svd了。

  吳軍的《數學之美》里其實已經介紹過用svd進行大數據的壓縮了,不過我這里還是針對圖像進行介紹一下吧。比如一幅1000*1000的圖像A,存儲就需要1000000個像素了。我們對A進行svd分解,則A=USV’,如果rank(A)=r,那么U就為1000*r的矩陣,S為r*r的矩陣,V為1000*r的矩陣。所以存儲的數據就是1000*r+r*r+1000*r個數了,如果這個r比較小,那么存儲的空間就會小很多了,當然了,如果r=1000,這時這樣來算svd就是既浪費了空間又浪費了時間。所以用這個svd時,還是先看看它的秩為好。

  下面給出程序和運行結果,這里使用不同的特征分量對原圖像進行重構,可以看一下效果。(這里悲劇的秩就是原圖的寬)

clear all;
close all;
clc;

a=imread('lena.jpg');

imshow(mat2gray(a))
[m n]=size(a);
a=double(a);
r=rank(a);
[s v d]=svd(a);

%re=s*v*d';
re=s(:,:)*v(:,1:1)*d(:,1:1)';
figure;
imshow(mat2gray(re));
imwrite(mat2gray(re),'1.jpg')

re=s(:,:)*v(:,1:20)*d(:,1:20)';
figure;
imshow(mat2gray(re));
imwrite(mat2gray(re),'2.jpg')

re=s(:,:)*v(:,1:80)*d(:,1:80)';
figure;
imshow(mat2gray(re));
imwrite(mat2gray(re),'3.jpg')

re=s(:,:)*v(:,1:150)*d(:,1:150)';
figure;
imshow(mat2gray(re));
imwrite(mat2gray(re),'4.jpg')

下面是效果圖:

 lena原圖

 只用第1個特征值進行重構

 用前10個特征值進行重構

 用前80個特征值進行重構

 用前150個特征值進行重構

最后說一些奇異值分解的應用:

1.圖像壓縮,正如上面的。

2.噪聲濾波。

3.模式識別。因為svd就是提取主要的成分嘛。

4.生物,物理,經濟方面的一些統計模型的處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM