本文章包含以下内容:
1.了解K-L变换的基本原理。
2.利用Matlab图像处理工具箱编程实现K-L变换;
3. 针对“Camerman.tif”图像进行K-L变换,分别取k=8,16,32,64个特征值时,重建图像比较重建图像的效果。
代码如下:
function U()
clear;
clc;
X = imread('cameraman.tif'); % 读取图像文件
% X = imread('peppers.png'); % 读取文件
% X=rgb2gray(X);
s = size(X); % 得到图像的大小
M = s(1);
N = s(2);
X_d = im2double(X); % 转为浮点型
for i = (1:M)
m(i)=sum(X_d(i,:))/N; % m是X每一列的均值(期望)
Y(i,:) = X_d(i,:) - m(i); % Y = X - mx
end
% 计算协方差矩阵
C = cov(X_d');
[A,L] = eig(C); % 协方差矩阵的特征值和特征向量eig的输出是由小到大
L = wrev(diag(L)); % 特征值是矩阵的对角元素
A = fliplr(A); % 把特征值大的排到前面
A = A';% 由于算特征矩阵时用的是X'这里转置回来
Y = A * Y; % Y = A(X - mx)
figure('Name','K-L变换'); % 开一个叫K-L变换的窗口
subplot(3,2,1);imshow(X);title('原图');
subplot(3,2,2);imshow(Y);title('变换后的Y');
subplot(3,2,3);imshow(X_new(A,Y,m,N, 8));title('最大的 8个特征');
subplot(3,2,4);imshow(X_new(A,Y,m,N,16));title('最大的16个特征');
subplot(3,2,5);imshow(X_new(A,Y,m,N,32));title('最大的32个特征');
subplot(3,2,6);imshow(X_new(A,Y,m,N,64));title('最大的64个特征');
function X_d = X_new(A,Y,m,N,x)
s = size(Y);
Y1 = zeros(s);
Y1(1:x,:) = Y(1:x,:);
X_d = A' * Y1; % 逆变换
for i = (1:N)
X_d(:,i) = X_d(:,i) + m'; % 加上均值
end
结果示例:
K-L变换大概过程是对图像求协方差矩阵C,再求协方差矩阵的特征值L和特征向量A,用Y = A * X,将原图像投影到Y上,Y的每一行都是不相关的,类似主成分,取特征向量大的几行,生成新的Y1,逆变换回去X = A'*Y1,