SVD分解原理及基于SVD分解的图像压缩和去噪

 

SVD分解是矩阵论中的一个知识点,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。SVD分解的公式如下,其中U和V都为正交矩阵,中间的为特征值构成的对角矩阵,相对于正交对角分解,SVD分解的适应性更强,应为A不必是方阵,下面是SVD分解的公式。

用SVD做图像压缩,就是用部分特征值以及左/右奇异矩阵部分列来近似矩阵A。对角矩阵的对角线元素都为非负的实数,且按照大小排列。大的特征值所对应的特征能够反映更多的矩阵信息。由于采用部分特征值及特征向量相对原始矩阵A而言,占用的空间更小,因此能够实现压缩。

%%-----------------------------------------------------
%%SVD分解,并且对图像进行压缩
%%-----------------------------------------------------
clc;clear all;close all;%清屏,关闭所有figure窗口,关闭所有工作空间变量

white=imread('white.jpg');%读入图片
[h w] = size(white(:,:,1));%h,w分别为图像的行数和列数
whiteDb = im2double(white);
imshow(whiteDb);

whiteNoise=imnoise(whiteDb);
figure;
imshow(whiteNoise);


[Sr,Vr,Dr] = svd(whiteDb(:,:,1));%对原始图像的R分量进行分解
[Sg,Vg,Dg] = svd(whiteDb(:,:,2));%对原始图像的G分量进行分解
[Sb,Vb,Db] = svd(whiteDb(:,:,3));%对原始图像的B分量进行分解
digVr = abs(diag(Vr));
figure;
plot([1:100],digVr(1:100),'-o');
xlabel('特征值的下标');ylabel('特征值的绝对值');title('拉伸强度随特征值数量的变换曲线');

%singularNumber = [1 10 30 50 100];%设置要取得奇异值的数量矩阵
%[numi,numj] = size(singularNumber);%取出来singularNumber的维数
%for j=1:numj
Rt = zeros(h,w);%生成SVD重构后的R分量矩阵
Gt = zeros(h,w);
Bt = zeros(h,w);
    for i=1:120%singularNumber(1,j)
        Rt = Rt+Vr(i,i)*Sr(:,i)*Dr(:,i)';%R分量求和
        Gt = Gt+Vg(i,i)*Sg(:,i)*Dg(:,i)';%G分量求和
        Bt = Bt+Vb(i,i)*Sb(:,i)*Db(:,i)';%B分量求和
    end

    ReImg(:,:,1) = Rt;ReImg(:,:,2) = Gt;ReImg(:,:,3) = Bt;
    ReImg = im2uint8(ReImg);
    figure;
    imshow(ReImg);
%end


原始的RGB图片一个分量,所占用的存储空间为m*n,而采用k个特征向量所重构的照片的存储空间为(m+n+1)*k,(m+n+1)<m*n,这就是它能够降低存储空间的原因。

下图是原始图片(像素数:780*1080)

以及采用120个特征值重构的图片(像素数:(780+120+1080)*120)。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nwsuaf_huasir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值