图像压缩之奇异值分解(SVD)

最近有点时间把之前研究的图像压缩相关内容做以下记录和总结,包括一些经典方法代码实现以及原理介绍。

首先直接上Lena女神原图照片。

对于SVD分解来说,选取不同的奇异值数量压缩倍数也不一样,简单理解就是选取的奇异值数量越多压缩倍数越小,反之越大,SVD的缺点就是以牺牲图像细节信息来达到图像压缩的目的。这也是为什么奇异值分解的图像压缩方法没有像DCT,小波变换一样成为JPEG压缩的标准吧。下面针对以下数据做一定实验,通过选取奇异值数量k为10,20,30,40来分别看一下图像压缩效果,如何能在尽量少舍弃奇异值甚至不舍弃奇异值的情况下达到图像压缩我觉得可以是研究的一个小方向。

时间复杂度

在矩阵M的奇异值分解中 M = UΣV*   ·

U的列(columns)组成一套对M的正交"输入"或"分析"的基向量。这些向量是MM*的特征向量。   ·

V的列(columns)组成一套对M的正交"输出"的基向量。这些向量是M*M的特征向量。   ·

Σ对角线上的元素是奇异值,可视为是在输入与输出间进行的标量的"膨胀控制"。这些是M*M及MM*的奇异值,并与U和V的行向量相对应。   

假设矩阵A为n*m,矩阵B为m*n ,则AxB,如下计算过程: 1、矩阵A中第一行的元素与矩阵B的第一列元素对应相乘,得 结果第一行的第一个元素要进行m次乘法运算,故总的需要m*n*m次乘法运算。 2、计算时间复杂度。 即大O,运行上限。故O(n^3)

SNum = 40;
a = imread('lena.bmp');
I=imresize(a,[400,400]);
h = size(I,1);
w = size(I,2);
R = I(:,:,1);
G = I(:,:,2);
B = I(:,:,3);
Rd = im2double(R);
Gd = im2double(G);
Bd = im2double(B);
[Ur,Sr,Vr] = svd(Rd);
[Ug,Sg,Vg] = svd(Gd);
[Ub,Sb,Vb] = svd(Bd);
Rt = zeros(h,w);
Gt = zeros(h,w);
Bt = zeros(h,w);
for i = 1:SNum
    Rt = Rt + Sr(i,i)*Ur(:,i)*Vr(:,i)';
    Gt = Gt + Sg(i,i)*Ug(:,i)*Vg(:,i)';
    Bt = Bt + Sb(i,i)*Ub(:,i)*Vb(:,i)';
end
I2(:,:,1) = im2uint8(Rt);
I2(:,:,2) = im2uint8(Gt);
I2(:,:,3) = im2uint8(Bt);
imshow(I2);

1.k=10

2.k=20

3.k=30

4.k=40

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页