基於奇異值分解(SVD)的映像壓縮
基於Matlab,將奇異值分解(SVD)用於映像的壓縮,並同步顯示奇異值的大小分布曲線、奇異值個數對壓縮率的影響。對奇異值分解用於映像壓縮整個過程的關鍵步驟都有映像記錄。
完整代碼如下:
%%%%%%%%%%%%%%%%%%%%%%%%%%%修改第9行的映像路徑即可,映像格式不限%2013.1.12 yangxin_szu%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear all;clc;%匯入映像X = imread('F:\M_Material\egle.bmp');if (size(X,3) ~= 1) X = rgb2gray(X);end%奇異值分解[U S V] = svd(double(X));%繪製奇異值的分布曲線plot(diag(S),'b-','LineWidth',3);title('映像矩陣的奇異值');ylabel('奇異值');%映像大小[m n] = size(X);%映像矩陣的秩Rank = rank(double(X));%顯示原圖figure,subplot(1,2,1),imshow(X);Image_Rank = ['映像矩陣的秩 = ' int2str(Rank)];title(Image_Rank,'Color','b');%%%迴圈改變奇異值選取的個數,動態觀察映像壓縮的效果%迴圈次數it = 1;iter = (Rank/4 - 1)/10 +1;%儲存奇異值的個數K_Store = ones(iter);%儲存不同奇異值個數對應的壓縮比CR_store = ones(iter);for K=1:10:Rank/4 K_Store(it) = K; %選取K個奇異值,並恢複原圖 R = U(:,1:K)*S(1:K,1:K)*V(:,1:K)'; T = uint8(R); %顯示恢複結果 subplot(1,2,2),imshow(T); SVD_number = ['選取的奇異值的個數 = ' int2str(K)]; title(SVD_number,'Color','b'); %計算壓縮比 src_elements = m*n; compress_elements = m*K + K*K + K*n; compress_ratio = (1 - compress_elements/src_elements)*100; CR_store(it) = compress_ratio; it = it+1; fprintf('Rank = %d : K = %d 個: compress_ratio = %.2f\n',Rank,K,compress_ratio); %暫停0.5秒,便於觀察效果 pause(0.5);end%%%繪製奇異值個數與壓縮比的關係曲線figure,plot(K_Store,CR_store,'b-','LineWidth',3);title('奇異值個數與壓縮比的關係');xlabel('奇異值個數');ylabel('壓縮比');
程式運行結果:
原圖:
奇異值大小的分布曲線:
奇異值個數的不同對映像壓縮率的影響:
奇異值個數與映像壓縮比的關係: