📄 klt_hjf.m
字号:
%KL变换
clc;
clear;
%读入图像,预处理
I1=imread('F:\matlabinstall\work\picture\lena_org.bmp');
I1=imresize(I1,[256,256]);
I1=double(I1);
figure(1);
imshow(I1/255);title('原始图');
x=zeros(4096,16);
%将原始图像划分为4*4的块,将每个块排列成一个16维的数据x((m-1)*64+n,(i-1)*4+j),一幅256*256的图像可以产生64*64=4096个向量
for m=1:64
for n=1:64
for i=1:4
for j=1:4
x((m-1)*64+n,(i-1)*4+j)=I1((m-1)*4+i,(n-1)*4+j);
end
end
end
end
%对每一个矢量求矩阵的均值,协方差矩阵
X=x';
mx=MEAN(MEAN(X));
cx=1/4096*(X*X')-mx*mx;
%求该矩阵的特征值和对应的特征向量
[V,D]=eig(cx);
V=fliplr(V);%因为matlab计算出的特征值按照递增顺序排列,所以做一个相应的变换,使其做递减的摆列
D=flipud(fliplr(D));
%求解KL正变换
g=zeros(4096,16);
for i=1:4096
g(i,:)=(V'*(x(i,:)-mx)')';
end
%截短至8位
y=zeros(4096,8);
y=g(:,(1:8));
W=V(:,(1:8));
%反变换
x=zeros(4096,16);
for i=1:4096
x(i,:)=(W*y(i,:)'+mx)';
end
%重组图像
newpic=zeros(256,256);
for i=1:64
for n=1:64
for j=1:4
for m=1:4
newpic((i-1)*4+j,(n-1)*4+m)=x((i-1)*64+n,(j-1)*4+m);
end
end
end
end
%截短至4位
y4=zeros(4096,4);
y4=g(:,(1:4));
W4=V(:,(1:4));
%反变换
x4=zeros(4096,16);
for i=1:4096
x4(i,:)=(W4*y4(i,:)'+mx)';
end
%重组图像
newpic4=zeros(256,256);
for i=1:64
for n=1:64
for j=1:4
for m=1:4
newpic4((i-1)*4+j,(n-1)*4+m)=x4((i-1)*64+n,(j-1)*4+m);
end
end
end
end
figure(2);
imshow(uint8(newpic));
title('8位数据重建图像');
figure(3);
imshow(uint8(newpic4));
title('4位数据重建图像');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -