压缩后图像矩阵的存储与解压缩怎么实现
要求
要求:是将一张bmp图像做压缩处理,将压缩后的数据保存下来,然后读取这些数据,把图像重构出来
用到的方法:奇异值分解
大致
出问题的地方:
cramp01方法中最后注释的两行
%cramp_all方法中把取整保存的cramp_lst = value;替换成下面的
cramp_lst = [left;val;right];
%cramp01方法中最后注释的两行
xiaoye = cat(2,cramp_lst01,cramp_lst02,cramp_lst03);
save('xiaoye.svd','xiaoye');结果是:
对于自定义的格式文件怎么读取
fopen('xiaoye.svd')
ans =
3完整代码
%图像压缩与保存
function cramp01(photo,rate)
img=imread(photo);
img_g=double(img);
%颜色分离
img_gr = img_g(:,:,1);
img_gg = img_g(:,:,2);
img_gb = img_g(:,:,3);
figure(1)
subplot(2,2,1)
image(img_gr),title('颜色分离r压缩前');
subplot(2,2,2)
image(img_gg),title('颜色分离g压缩前');
subplot(2,2,3)
image(img_gb),title('颜色分离b压缩前');
%cramp_all奇异值分解
cramp_lst01=cramp_all(img_gr,rate);
cramp_lst02=cramp_all(img_gg,rate);
cramp_lst03=cramp_all(img_gb,rate);
%图像重构
xiaoye = cat(3,cramp_lst01,cramp_lst02,cramp_lst03);
piaopiao = cat(3,cramp_lst03,cramp_lst01,cramp_lst02);%重新rgb通道位置
disp(size(xiaoye));
figure
image(uint8(xiaoye));
figure
image(uint8(piaopiao));
%xiaoye = cat(2,cramp_lst01,cramp_lst02,cramp_lst03);
%save('xiaoye.svd','xiaoye');下面是奇异值分解的方法
function cramp_lst=cramp_all(pho,rate)
%传入的pho默认已经是bouble型
[u,s,v]=svd(pho);
[row,col] = size(s);
k=floor((row*col)*rate/(row+col+1));
left=u(:,1:k);
val=s(1:k,1:k);
right=v(:,1:k);
%需要把处理后的数据约束在0-255范围内
low=min(min(pho));
high=max(max(pho));
value=left*val*right';
figure(2);
for i=1:3
subplot(2,2,i);
%显示灰度图像 I,以二元素向量 [low high] 形式指定显示范围。
imshow(value,[low,high]),title('压缩后图像');
end
%取整保存
cramp_lst = value;
%初始化大小
%cramp_lst = [left;val;right];执行结果:
cramp01('mjjy.bmp',0.15)原图:
rgb分离后:
图1:
图2:
重构后:
按原来颜色通道的排列顺序重构的:
改变顺序的重构:
😣😣😣😣
问问大佬们那个自定义格式的文件怎么较快的读取出来,存储时怎么减小存储空间浪费
