1. 程式人生 > >主成分分析(PCA)在壓縮影象方面的應用

主成分分析(PCA)在壓縮影象方面的應用

一、主成分分析的原理

主成分分析能夠通過提取資料的主要成分,減少資料的特徵,達到資料降維的目的。
具體的原理可參見之前寫的關於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