介紹一下奇異值分解來壓縮圖像。今年的上半年中的一篇博客貼了一篇用奇異值分解處理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.生物,物理,經濟方面的一些統計模型的處理。