matlab进行图像降维,KLT降维与图像压缩(附MATLAB代码)
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ˉ=NT1∑i=1NTxnispa
计算协方差矩阵的特征值和特征向量。特征值为λ
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=1Kcipi
c
i
=
p
i
T
x
c_{i}=\bm{p}_{i}^{T}\bm{x}ci=piTx, 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=1rcipi, 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代码)相关推荐
- matlab中多元线性回归regress函数精确剖析(附实例代码)
matlab中多元线性回归regress函数精确剖析(附实例代码) 目录 前言 一.何为regress? 二.regress函数中的参数 三.实例分析 总结 前言 regress函数功能十分强大,它可 ...
- 光纤光栅matlab,基于PSO算法的光纤光栅参数重构(附Matlab源程序)
基于PSO算法的光纤光栅参数重构(附Matlab源程序)(含任务书,开题报告,外文翻译,毕业论文12600字) 摘要: 本文利用粒子群优化算法重构了啁啾光纤光栅的结构参数.根据啁啾光纤光栅的目标反射谱 ...
- MATLAB图像处理——图像中余弦噪声去除(附代码)
图像中规则余弦噪声去除 问题描述 傅里叶变化 带阻滤波器 滤波 结果 改进 代码 问题描述 有以下增加噪声后的图像: 从图上可以明显看出在x方向上叠加了一正弦规律变化的噪声,要对其进行去噪处理,比较简 ...
- matlab提取图像中的一部分并移动,在Matlab中从图像中提取对象
这是一个很好的解决问题.这是一种你可以使用的方法,但我承认它绝不是完美的,也可能不那么健壮.希望它能带给你创意-- 我所做的基本上是用中值滤波器过滤图像(就像你做的那样)并使用bwareaopen删除 ...
- vc调用matlab直方图,图像各向异性扩散算法(VC与Matlab版本实现)
主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的(和双边滤波很像). 通常我们有将图像看作矩阵的,看作图的,看作随机过程的,记得过去还有看作力场的. 这次新鲜,将图 ...
- 【图像压缩】基于香农熵多级阈值实现图像压缩附matlab代码
1 简介 图像压缩是图像传输和存储中的最重要步骤之一,图像压缩技术可以分为两种方式即有损和无损压缩.有损压缩的特点是一些重要的数据可能会因为压缩被覆盖,这不会发生在无损压缩中,因此有损压缩一般用于流媒 ...
- 【图像检测-显著性检测】基于蚁群算法优化图像视觉显着性检测附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
- matlab中图像太大,图像处理:算法在MATLAB中耗时太长
您可以使用im2col *将图片转换为列格式,以便每个块形成[64 * 4096]矩阵的列.然后对每列应用转换,并使用bsxfun来向量化错误计算. DomainImage=rand(512); Ra ...
- MATLAB在人工智能中的应用案例:以MATLAB的方式玩转自动驾驶(附部分代码)
前言 当博主还在读大学时,时光就经常在和朋友们讨论奔驰 AMG 马力如何强劲,路虎更酷还是卡宴更帅这些话题中度过.那时对我们而言,自动驾驶依然仅存在于科幻电影中,这样的汽车出现在现实里宛如天方夜谭.然 ...
最新文章
- 用koa mongodb 做了个简单的博客系统
- 海思芯片固件修改工具_地平线X3开发板开箱、固件刷写、环境配置
- 互联网公司败局汇总,这些公司都是怎么死的?(下篇)
- CentOS修改yum源为阿里云
- 接着做!一往无前!冲!就是我的信条!
- Camera摄像头工作原理
- 曼彻斯特编码_两种编码方式以及两种帧结构
- 三个梯度磁场_第二节 梯度磁场系统
- mysql 修改密码
- Atitit。团队建设--管理最佳实践--如何留住核心人才,防止人才流失 ??
- Jensen不等式的证明
- VS2017离线下载安装包教程
- stm32f205开发记录
- 一文让你理清导数、方向导数、梯度向量之间的关系~
- 搜索引擎技术 —— 网络爬虫
- 计算机专业论文评定意见,毕业论文评定意见(级).doc
- ubuntu20.04安装Strom集群
- 经典文学之三:鲁迅·故乡
- 高等代数 线性映射(第9章)1 概念,运算,核与象
- bootcmd执行过程