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
1∼1,1∼10,1∼20,1∼30
>> 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))
因篇幅问题不能全部显示,请点此查看更多更全内容