圖像壓縮(SVD方法)

原理

奇異值分解在圖像處理中有着重要應用。假定一幅圖像有nn 個像素,如果將這n2 個數據一起傳送,往往會顯得數據量很大。因此我們希望能夠改傳送另外一些比較少的數據,在接收端利用這些數據重構原圖像。
假定對矩陣A 進行奇異值分解,便得到A=UΣV2 ,其中,奇異值從小到大的順序排列。如果從中選取k 個大奇異值以及這些對應的左右奇異向量逼近原圖像,便可以共使用k(2n+1) 個數值取代原來的nn 個圖像數據。
圖像的壓縮比率

ρ=n2k(2n+1)

代碼

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。若要增大壓縮率,保留較少就可以了。
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

發佈了50 篇原創文章 · 獲贊 76 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章