svd方法的图像压缩Matlab代码

svd方法的图像压缩 \color{green}\Large\textbf{svd方法的图像压缩} svd方法的图像压缩

文章目录

说明

一个用matlab写的svd图像压缩函数,关键在于理解svd分解

%%%
%函数名称  svdcompress(FilePath,fstSingular,lstSingular,toGray)
%函数功能: 使用svd分解压缩图像
%输入参数:
%   FilePath    :图像路径
%   fstSingular :压缩范围的起始奇异值
%   lstSingular ;压缩范围的结尾奇异值
%   toGray     :是否进行灰度化  0:否    1:是
%输出参数:
%   compressedImage    :压缩后的图像
%%%
function[compressedImage] = svdcompress(FilePath,fstSingular,lstSingular,toGray)

if nargin < 4   %如果输入的参数少于4
    toGray = 0; %则默认toGray为0,不进行灰度化
end

raw = imread(FilePath);

%判断原图是否是彩色的:1, 0不是
if numel(size(raw)) > 2
    iscolor = 1;
else
    iscolor = 0;
end

%当灰度化指令为1且图像为彩色的时才进行灰度化
if toGray == 1 && iscolor == 1
    raw = rgb2gray(raw);
    iscolor = 0;
end

raw = im2double(raw);%将图像矩阵数据转化为双浮点精度型,因为只有双浮点和单浮点矩阵可以被svd()函数使用
switch iscolor
    case 0%如果输入的是灰色图
        compressedImage = im2uint8(compress(raw,fstSingular,lstSingular));%对原图直接进行svd压缩
    case 1%如果输入的是彩色图
        redLayer = raw(:,:,1);  %分离红色图层
        greenLayer = raw(:,:,2);%分离绿色图层
        blueLayer = raw(:,:,3); %分离蓝色图层
        
        cpdredLayer = compress(redLayer,fstSingular,lstSingular);    %对红色图层进行svd压缩
        cpdgreenLayer = compress(greenLayer,fstSingular,lstSingular);%对绿色图层进行svd压缩
        cpdblueLayer = compress(blueLayer,fstSingular,lstSingular);  %对蓝色图层进行svd压缩
        
        %构建压缩后的图像
        compressedImage(:,:,1) = cpdredLayer;  %导入压缩后的红色图层
        compressedImage(:,:,2) = cpdgreenLayer;%导入压缩后的绿色图层
        compressedImage(:,:,3) = cpdblueLayer; %导入压缩后的蓝色图层
        compressedImage = im2uint8(compressedImage);%转换为int型数据类型
    
    otherwise
        redLayer = raw(:,:,1);  %分离红色图层
        greenLayer = raw(:,:,2);%分离绿色图层
        blueLayer = raw(:,:,3); %分离蓝色图层
        
        cpdredLayer = compress(redLayer,fstSingular,lstSingular);    %对红色图层进行svd压缩
        cpdgreenLayer = compress(greenLayer,fstSingular,lstSingular);%对绿色图层进行svd压缩
        cpdblueLayer = compress(blueLayer,fstSingular,lstSingular);  %对蓝色图层进行svd压缩
        
        %构建压缩后的图像
        compressedImage(:,:,1) = cpdredLayer;  %导入压缩后的红色图层
        compressedImage(:,:,2) = cpdgreenLayer;%导入压缩后的绿色图层
        compressedImage(:,:,3) = cpdblueLayer; %导入压缩后的蓝色图层
        compressedImage = im2uint8(compressedImage);%转换为int型数据类型
end
end


function [compressedImage] = compress(layer,fstSingular,lstSingular)
%防止压缩区域过大或过小
if fstSingular < 1 
    fstSingular = 1; 
end;
if lstSingular > rank(layer)
    lstSingular = rank(layer);
end;
[U,S,V] = svd(layer);%svd分解
S_Extracted = S(:,fstSingular:lstSingular);%提出压缩范围内的奇异值
V_Extracted=V(:,fstSingular:lstSingular);  %提出压缩范围内的奇异值所对应的特征向量
compressedImage = U*S_Extracted*V_Extracted';       %重构压缩后的图层
end

测试结果

四幅图奇异值范围分别为 1 ∼ 1 , 1 ∼ 10 , 1 ∼ 20 , 1 ∼ 30 1\thicksim1, 1\thicksim10,1\thicksim20,1\thicksim30 11110120130
在这里插入图片描述

>> imshow(svdcompress('K:\ImageSrc\cat.jpg',1,1))
>> imshow(svdcompress('K:\ImageSrc\cat.jpg',1,10))
>> imshow(svdcompress('K:\ImageSrc\cat.jpg',1,20))
>> imshow(svdcompress('K:\ImageSrc\cat.jpg',1,30))
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值