KLT简述

KLT (Karhunen-Loeve Transform) 是变换编码 (Transform Coding) 的一种方法,它可以将数据转化为更利于压缩的一种形式,去除数据相关性形成的冗余。KLT通常也称为PCA (Principal Component Analysis) 或者EVD (Eigenvalue Decomposition), 在不一样的课程和教材中它们可能有一些差异,但本文将要讲的图像压缩中的KLT指的就是计算图像协方差矩阵,保留较大的特征值和其对应的特征向量的方法。html

步骤原理

首先将待处理的图像分割成n个M

×

N

M\times NM×N 的图像块,并将图像块中数据按照从左到右,从上到下的顺序从新排列成一个列向量,每个列向量长度为M

×

N

M\times NM×N,共有N

T

N_{T}NT​个这样的列向量,第i

ii个列向量为x

n

i

\bm{x}_{ni}xni​

以二维向量为例,假设每个向量能够表示为[

x

1

,

x

2

]

T

\left [x_1,x_2 \right ]^T[x1​,x2​]T,那么能够将这些数据点表示在二维平面内,以下图所示,椭圆内为二维向量分布点。web

数据中心化:x

=

x

n

i

x

ˉ

\bm{x}=\bm{x}_{ni}-\bar{\bm{x}}x=xni​−xˉ ,其中x

ˉ

\bar{\bm{x}}xˉ为全部列向量的均值。能够看做将数据集平移至原点。app

计算协方差矩阵C

\bm{C}Cide

C

=

E

[

x

x

T

]

=

E

[

(

x

n

i

x

ˉ

)

(

x

n

i

x

ˉ

)

T

]

\bm{C}=E\left [\bm{x}\bm{x}^{T} \right ]=E\left [(\bm{x}_{ni}-\bar{\bm{x}})(\bm{x}_{ni}-\bar{\bm{x}})^{T} \right ]C=E[xxT]=E[(xni​−xˉ)(xni​−xˉ)T]svg

C

=

1

N

T

1

i

=

1

N

T

(

x

n

i

x

ˉ

)

(

x

n

i

x

ˉ

)

T

\bm{C}=\frac{1}{N_{T}-1}\sum_{i=1}^{N_{T}}(\bm{x}_{ni}-\bar{\bm{x}})(\bm{x}_{ni}-\bar{\bm{x}})^{T}C=NT​−11​∑i=1NT​​(xni​−xˉ)(xni​−xˉ)T编码

x

ˉ

=

1

N

T

i

=

1

N

T

x

n

i

\bar{\bm{x}}=\frac{1}{N_{T}}\sum_{i=1}^{N_{T}}\bm{x}_{ni}xˉ=NT​1​∑i=1NT​​xni​spa

计算协方差矩阵的特征值和特征向量。特征值为λ

1

\lambda _{1}λ1​,λ

2

\lambda _{2}λ2​,…,λ

K

\lambda _{K}λK​,分别对应的特征向量为p

1

\bm{p}_{1}p1​,p

2

\bm{p}_{2}p2​,…,p

K

\bm{p}_{K}pK​,其中K

=

M

×

N

K=M\times NK=M×N。这样协方差矩阵能够表示为:code

C

=

P

D

P

T

\bm{C}=\bm{PDP^{T}}C=PDPTcomponent

P

=

[

p

1

,

p

2

,

.

.

.

,

p

K

]

P=\left [ \bm{p}_{1},\bm{p}_{2},...,\bm{p}_{K} \right ]P=[p1​,p2​,...,pK​]orm

D

=

d

i

a

g

(

λ

1

,

λ

2

,

.

.

.

,

λ

K

)

D=diag( \lambda _{1},\lambda _{2},...,\lambda _{K})D=diag(λ1​,λ2​,...,λK​)

向量的分解和合成:

x

=

i

=

1

K

c

i

p

i

\bm{x}=\sum_{i=1}^{K}c_{i}\bm{p}_{i}x=∑i=1K​ci​pi​

c

i

=

p

i

T

x

c_{i}=\bm{p}_{i}^{T}\bm{x}ci​=piT​x, i

=

1

,

2

,

.

.

.

,

K

i=1,2,...,Ki=1,2,...,K

保留较大的特征值和其对应的特征矩阵,舍弃较小的特征值,近似地重构原向量,达到降维或者说压缩的目的。

x

^

=

i

=

1

r

c

i

p

i

\hat{\bm{x}}=\sum_{i=1}^{r}c_{i}\bm{p}_{i}x^=∑i=1r​ci​pi​, r

<

K

r<Kr

如图中保留c

1

c_{1}c1​,舍弃c

2

c_{2}c2​,只须要一个参数就能表达原来两个参数的信息,并能实现较小的偏差。

MATLAB代码

选用的原图为lena 512*512灰度图像,切分红的图像块大小为4*4,获得的向量长度应该为16,下面为图像进行KLT压缩的代码,输出分别保留1到16个特征值的MSE (Mean Square Error)的值。

%% load image and cast to double dtype

clear;

img=imread('lena512.bmp');

figure(1);

subplot(1,2,1);

imshow(img);

title('original image');

gray_values=double(img);

%% divide the image into several 4*4 block

num_batch=512/4;

blocks=mat2cell(gray_values,4*ones(1,num_batch),4*ones(1,num_batch));

% vector length is 16

x=zeros(16,num_batch^2);

% map the block into column vector

for ii=1:num_batch

for jj=1:num_batch

x(:,(ii-1)*num_batch+jj)=reshape(blocks{ii,jj}',[16,1]);

end

end

%% mean and covariance

x_mean=mean(x,2);

num_vectors=size(x,2);

temp_C=zeros(16,16);

for ii=1:num_vectors

temp_C=temp_C+(x(:,ii)-x_mean)*(x(:,ii)-x_mean)';

end

C=1/(num_vectors-1)*temp_C;

%% eigenvalues and eigen vectors

eigenvalues=eig(C)';

[P,D]=eig(C);

% 16 eigenvalues are 1.0e+04 *

% 0.0007 0.0009 0.0011 0.0011 0.0013 0.0019 0.0022 0.0036

% 0.0041 0.0052 0.0063 0.0161 0.0197 0.0421 0.1047 3.4533

% select the eigenvalues and the corresponding eigenvectors

% from larger to smaller

MSE=zeros(1,16);

for select_numbers=1:16

% select_numbers=5;

selected_p=zeros(16,select_numbers);

for ii=1:select_numbers

selected_p(:,ii)=P(:,17-ii);

end

%% calculate the principle components

comp=zeros(select_numbers,num_vectors);

for jj=1:num_vectors

for ii=1:select_numbers

comp(ii,jj)=selected_p(:,ii)'*x(:,jj);

end

end

%% calculate the estimated vectors

x_estimated=zeros(size(x));

for jj=1:num_vectors

for ii=1:select_numbers

x_estimated(:,jj)=x_estimated(:,jj)+comp(ii,jj)*selected_p(:,ii);

end

end

%% reconstruct the image with the estimated vectors

new_block=zeros(4,4,num_vectors);

for ii=1:num_vectors

new_block(:,:,ii)=reshape(x_estimated(:,ii),[4,4])';

end

reconstruct_img=zeros(512,512);

for start_row=1:4:512

for start_column=1:4:512

reconstruct_img(start_row:(start_row+3),start_column:(start_column+3))= ...

new_block(:,:,floor(start_row/4)*num_batch+floor(start_column/4)+1);

end

end

square_error=(reconstruct_img-gray_values).^2;

MSE(select_numbers)=mean(square_error(:));

%%

% subplot(1,2,2);

% imshow(reconstruct_img,[]);

% title('reconstructed image');

end

figure(2);

plot(1:16,MSE);

xlabel('The number of retained coefficients');

ylabel('MSE between original and reconstructed image');

结果分析

能够看出保留特征值数越多,重建图像偏差越小,下面来展现下重建后图像的样子。

保留一个特征值:

能够看出图片失真较为明显。保留5个特征值时图像重建后与原图像的偏差已经很难分辨出来:

KLT有着良好的压缩率和图像压缩质量,然而也有必定的局限性。首先KLT变换是基于图片的,特征值和特征向量是基于当前图片获得的,应用于其余图片效果不必定好。此外KLT须要计算协方差矩阵,计算复杂度较高。

matlab进行图像降维,KLT降维与图像压缩(附MATLAB代码)相关推荐

  1. matlab中多元线性回归regress函数精确剖析(附实例代码)

    matlab中多元线性回归regress函数精确剖析(附实例代码) 目录 前言 一.何为regress? 二.regress函数中的参数 三.实例分析 总结 前言 regress函数功能十分强大,它可 ...

  2. 光纤光栅matlab,基于PSO算法的光纤光栅参数重构(附Matlab源程序)

    基于PSO算法的光纤光栅参数重构(附Matlab源程序)(含任务书,开题报告,外文翻译,毕业论文12600字) 摘要: 本文利用粒子群优化算法重构了啁啾光纤光栅的结构参数.根据啁啾光纤光栅的目标反射谱 ...

  3. MATLAB图像处理——图像中余弦噪声去除(附代码)

    图像中规则余弦噪声去除 问题描述 傅里叶变化 带阻滤波器 滤波 结果 改进 代码 问题描述 有以下增加噪声后的图像: 从图上可以明显看出在x方向上叠加了一正弦规律变化的噪声,要对其进行去噪处理,比较简 ...

  4. matlab提取图像中的一部分并移动,在Matlab中从图像中提取对象

    这是一个很好的解决问题.这是一种你可以使用的方法,但我承认它绝不是完美的,也可能不那么健壮.希望它能带给你创意-- 我所做的基本上是用中值滤波器过滤图像(就像你做的那样)并使用bwareaopen删除 ...

  5. vc调用matlab直方图,图像各向异性扩散算法(VC与Matlab版本实现)

    主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的(和双边滤波很像). 通常我们有将图像看作矩阵的,看作图的,看作随机过程的,记得过去还有看作力场的. 这次新鲜,将图 ...

  6. 【图像压缩】基于香农熵多级阈值实现图像压缩附matlab代码

    1 简介 图像压缩是图像传输和存储中的最重要步骤之一,图像压缩技术可以分为两种方式即有损和无损压缩.有损压缩的特点是一些重要的数据可能会因为压缩被覆盖,这不会发生在无损压缩中,因此有损压缩一般用于流媒 ...

  7. 【图像检测-显著性检测】基于蚁群算法优化图像视觉显着性检测附matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  8. matlab中图像太大,图像处理:算法在MATLAB中耗时太长

    您可以使用im2col *将图片转换为列格式,以便每个块形成[64 * 4096]矩阵的列.然后对每列应用转换,并使用bsxfun来向量化错误计算. DomainImage=rand(512); Ra ...

  9. MATLAB在人工智能中的应用案例:以MATLAB的方式玩转自动驾驶(附部分代码)

    前言 当博主还在读大学时,时光就经常在和朋友们讨论奔驰 AMG 马力如何强劲,路虎更酷还是卡宴更帅这些话题中度过.那时对我们而言,自动驾驶依然仅存在于科幻电影中,这样的汽车出现在现实里宛如天方夜谭.然 ...

最新文章

  1. 用koa mongodb 做了个简单的博客系统
  2. 海思芯片固件修改工具_地平线X3开发板开箱、固件刷写、环境配置
  3. 互联网公司败局汇总,这些公司都是怎么死的?(下篇)
  4. CentOS修改yum源为阿里云
  5. 接着做!一往无前!冲!就是我的信条!
  6. Camera摄像头工作原理
  7. 曼彻斯特编码_两种编码方式以及两种帧结构
  8. 三个梯度磁场_第二节 梯度磁场系统
  9. mysql 修改密码
  10. Atitit。团队建设--管理最佳实践--如何留住核心人才,防止人才流失 ??
  11. Jensen不等式的证明
  12. VS2017离线下载安装包教程
  13. stm32f205开发记录
  14. 一文让你理清导数、方向导数、梯度向量之间的关系~
  15. 搜索引擎技术 —— 网络爬虫
  16. 计算机专业论文评定意见,毕业论文评定意见(级).doc
  17. ubuntu20.04安装Strom集群
  18. 经典文学之三:鲁迅·故乡
  19. 高等代数 线性映射(第9章)1 概念,运算,核与象
  20. bootcmd执行过程

热门文章

  1. 记录狗血的这周末 我心态炸了
  2. Xshell 执行文件 .sh
  3. 数据结构-String中的chars()和codePoints
  4. sdcard-dma
  5. SnowNlp中文分词和中文关键词提取只能提取单个字不能提取分词的解决方法
  6. 字符函数和字符串函数(上)
  7. 手把手开始构建java新项目—医疗健康管理系统(一)
  8. 你管这叫操作系统源码(三)
  9. 51单片机时钟输出80HZ频率
  10. 用MATLAB的APPDesigner对数字图像进行操作