利用Matlab进行图像变换(K-L变换)

该博客详细介绍了K-L变换的基本原理,并通过Matlab代码展示了如何对'Camerman.tif'图像进行K-L变换。代码实现了从计算协方差矩阵、求解特征值和特征向量到图像投影和重构的过程。通过选取不同数量的特征值(8, 16, 32, 64),对比了重构图像的质量,突显了K-L变换在图像压缩中的应用。
摘要由CSDN通过智能技术生成

本文章包含以下内容:

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,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值