主成分分析(PCA)在壓縮影象方面的應用
阿新 • • 發佈:2018-12-30
一、主成分分析的原理
主成分分析能夠通過提取資料的主要成分,減少資料的特徵,達到資料降維的目的。
具體的原理可參見之前寫的關於PCA原理的一篇文章:
二、使用matlab模擬實現
%% 利用PCA對影象壓縮 close all clear all clc %% 輸入 In = imread('lena_gray_256.tif'); %% 輸入引數 num_val = 1; %取前num_val個特徵值 size_block = 4; %取size_block*size_block塊 %% 將原影象矩陣分割成n*n的塊,再轉化為列矩陣,構成最終矩陣reIn In = im2double(In); [row rol] = size(In); m = 0; Data = zeros(size_block*size_block,(row/size_block)*(rol/size_block)); % 資料矩陣 for i = 1:size_block:row for j = 1:size_block:rol m = m+1; block = In(i:i+size_block-1,j:j+size_block-1); Data(:,m) = block(:); end end %% PCA處理 Data1 = Data - ones(size(Data,1),1)*mean(Data); % 標準化處理 c = cov(Data1'); % 求矩陣協方差矩陣 [vec,val] = eig(c); % 求特徵值和特徵向量 % 按特徵值降序排列 val = diag(val); % 從對角線拿出特徵值 [val t] = sort(val,'descend'); % 特徵值降序排列 vec = vec(:,t); % 特徵向量也對應改變順序 %% 重構影象 vec_new = vec(:,1:num_val); % 取前k個特徵向量 %% 計算所取特徵值貢獻率 rata = val./sum(val); rata_sum = sum(rata(1:num_val)); fprintf('選取%g個特徵值的貢獻率為:%g',num_val,rata_sum); y = vec_new'* Data; % 對映 由公式:y=w'*x Data2 = vec_new * y; % 重構影象 Data2 = Data2 + ones(size(vec_new, 1), 1) * mean(Data); % 加均值 m = 0; for i = 1:size_block:row for j = 1:size_block:rol m = m + 1; block1 = reshape(Data2(:, m), size_block, size_block); % 列向量塊轉化為方塊 Out(i:i+size_block-1, j:j+size_block-1) = block1; end end %% 顯示影象 imshow(In),title('原圖') figure,imshow(Out),title('壓縮後的影象') imwrite(Out,'壓縮後的影象.jpg')
實驗結果:
k=1:
選取1個特徵值的貢獻率為:0.440833
k=8:
選取8個特徵值的貢獻率為:0.906031