介紹一下奇異值分解來壓縮圖像。今年的上半年中的一篇博客貼了一篇用奇異值分解處理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時,還是先看看它的秩為好。
下面給出程序和運行結果,這里使用不同的特征分量對原圖像進行重構,可以看一下效果。(這里悲劇的秩就是原圖的寬)
1 clear all; 2 close all; 3 clc; 4
5 a=imread('lena.jpg'); 6
7 imshow(mat2gray(a)) 8 [m n]=size(a); 9 a=double(a); 10 r=rank(a); 11 [s v d]=svd(a); 12
13 %re=s*v*d';
14 re=s(:,:)*v(:,1:1)*d(:,1:1)';
15 figure; 16 imshow(mat2gray(re)); 17 imwrite(mat2gray(re),'1.jpg') 18
19 re=s(:,:)*v(:,1:20)*d(:,1:20)';
20 figure; 21 imshow(mat2gray(re)); 22 imwrite(mat2gray(re),'2.jpg') 23
24 re=s(:,:)*v(:,1:80)*d(:,1:80)';
25 figure; 26 imshow(mat2gray(re)); 27 imwrite(mat2gray(re),'3.jpg') 28
29 re=s(:,:)*v(:,1:150)*d(:,1:150)';
30 figure; 31 imshow(mat2gray(re)); 32 imwrite(mat2gray(re),'4.jpg')
下面是效果圖:
lena原圖
只用第1個特征值進行重構
用前10個特征值進行重構
用前80個特征值進行重構
用前150個特征值進行重構
最后說一些奇異值分解的應用:
1.圖像壓縮,正如上面的。
2.噪聲濾波。
3.模式識別。因為svd就是提取主要的成分嘛。
4.生物,物理,經濟方面的一些統計模型的處理。
