压缩后图像矩阵的存储与解压缩怎么实现
要求
要求:是将一张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:
重构后:
按原来颜色通道的排列顺序重构的:
改变顺序的重构:
😣😣😣😣
问问大佬们那个自定义格式的文件怎么较快的读取出来,存储时怎么减小存储空间浪费