原理
奇異值分解在圖像處理中有着重要應用。假定一幅圖像有
假定對矩陣
圖像的壓縮比率
代碼
clear all;close all; clc
f = imread('lena.jpg');
[m,n] = size(f);
k = 100; %保留最大奇異值個數
f = double(f); %uint8類型
[u,s,v] = svd (f); %進行奇異值分解,這裏s爲對角矩陣
s = diag(s); %提出對角矩陣的對角線元素,得到一個向量
smax = max(s);smin = min(s); %求最大奇異值和最小奇異值
s1=s;s1(k:end) = 0; %只保留前20個大的奇異值,其他奇異值置零
s1 = diag(s1); %把向量變成對角矩陣
g = u*s1*v'; %計算壓縮以後的圖像矩陣
g = uint8(g);
compressratio = n^2/(k*(2*n+1));
subplot(1,2,1),imshow(mat2gray(f));title('source') %原圖
subplot(1,2,2),imshow(g); title(['compress ratio',num2str(compressratio)]) %壓縮後的圖像
figure,plot(s,'.','Color','k') %畫出奇異值對應的點
結果
從圖像的奇異值分佈情況,可以看出來但保留前100個圖像的奇異值,基本上可以保留圖像的大部分信息,此時的壓縮率2.5575。若要增大壓縮率,保留較少就可以了。