⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compress.m

📁 数据压缩
💻 M
字号:
%用 J(k,l)=I(k,l)-(I(k,l-1)/2+I(k-1,l)/4+I(k-1,l-1)/8+I(k-1,l+1)/8)进行预测编码 
clc,clear all
I = rgb2gray(imread('lena.jpg')); %彩色图像转换为灰度图像
I2=I; 
I=double(I); 
fid = fopen('mydata.dat','w'); 
[m n] = size(I); 
J=zeros(m,n); 
%边界点不可预测,保留原值
J(1:m,1)=I(1:m,1); 
J(1,1:n)=I(1,1:n); 
J(1:m,n)=J(1:m,n); 
J(m,1:n)=J(m,1:n);
%计算预测器系数
J1=zeros(1,m*n);
R1=zeros(1,5);
A1=zeros(1,4); %预测器系数
B1=zeros(4,4);
B2=zeros(4,1);
for k =1:m
    for l=1:n
        J1((k-1)*m+l)=I(k,l);
    end
end
for k=0:4
    for l=k+1:20
        R1(k+1)=R1(k+1)+J1(1,l-k)*J1(1,l)/20;
    end
end
for k=1:4
    for l=1:4
        B1(k,l)=R1(abs(k-l)+1);
    end
end
for k=1:4
    B2(k,1)=R1(k+1);
end
A1=B1\B2;
A1
%计算预测误差
for k=2:m-1 
    for l=2:n-1 
        J(k,l)=I(k,l)-(I(k,l-1)*A1(1)+I(k-1,l)*A1(2)+I(k-1,l-1)*A1(3)+I(k-1,l+1)*A1(4)); 
    end 
end 
%量化预测误差
a=max(J);
b=min(J);
c=20; %量化层数  
t=round((a+b)/c);  %量化间隔
for k=a:t:b
    for p=1:m
        for q=1:n
            if((J(p,q)>k) & (J(p,q)<=(k+t)))
                J(p,q)=(2*k+t)/2;
            end
        end
    end
end
J=round(J);
%保存预测编码文件
cout=fwrite(fid,J,'int8'); 
cc=fclose(fid); 
%预测编码的解压缩过程
fid=fopen('mydata.dat','r');
I1=fread(fid,inf,'int8');
tt=1;
for l=1:n
    for k=1:m
        I(k,l) = I1(tt);
        tt=tt+1;
    end
end
I=double(I);
J=zeros(m,n);
J(1:m,1)=I(1:m,1);
J(1,1:n)=I(1,1:n);
J(1:m,n)=I(1:m,n);
J(m,1:n)=I(m,1:n);
%由预测误差还原图像
for k=2:m-1
    for l=2:n-1
        J(k,l)=I(k,l)+(J(k,l-1)*A1(1)+J(k-1,l)*A1(2)+J(k-1,l-1)*A1(3)+J(k-1,l+1)*A1(4));
    end
end
cc=fclose(fid);
J=uint8(J);
sqnr=20*log10(norm(double(I2))/norm(double(I2)-double(J)))
subplot(1,2,1),imshow(I2);
subplot(1,2,2),imshow(J);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -