⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 klt_hjf.m

📁 一个简单的图像的kl变换matlab程序,这里需要自己找图像
💻 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 + -