function JPEG;
close all;clear all;clc;
J=imread('05.jpg');
imwrite(J,'05 质量因子80.jpg','quality',80);
x=imread('05 质量因子80.jpg');
R=rgb2gray(x);
I=double(R);
imwrite(R,'05 灰度图.jpg');
%% 图像分割 以8x8为最小单元分割,可分割成4096个方块,从上往下,得到32768x8的矩阵
% lena512: 512*512
% Block: 32768*8
Block=[];
for numi=1:64 %逐行取方阵
m=(numi-1)*8+1; %每块行的开头
for numj=1:64 %逐列取方阵
n=(numj-1)*8+1; %每块列的开头
Block=[Block; I(m:m+7,n:n+7)];
end
end
%% 离散余弦变换 DCT变换 对4096个方阵分别进行DCT变换,得到4096个变换方阵,从上往下存,32768x8的矩阵
% Block: 32768*8
% FBlock: 32768*8
for num=1:4096
start=(num-1)*8+1;
FBlock(start:start+7,:)=dct2(Block(start:start+7,:));
end
%% 量化 对4096个方阵分别根据JPEG亮度标准量化表进行量化,从上往下存,32768x8的矩阵,部分高频分量被舍弃,减小了视觉冗余
% FBlock: 32768*8
% QBlock: 32768*8
load('JPEG512.mat','lighttable');%JPEG标准亮度量化表
for num=1:4096
start=(num-1)*8+1;
QBlock(start:start+7,:)=round(FBlock(start:start+7,:)./lighttable);
end
%% 反向量化
% QBlock: 32768*8
% reFBlock: 32768*8
for num=1:4096
start=(num-1)*8+1;
reFBlock(start:start+7,:)=QBlock(start:start+7,:).*lighttable;
end
%% 反离散余弦变换 IDCT
for num=1:4096
start=(num-1)*8+1;
Block(start:start+7,:)=idct2(reFBlock(start:start+7,:));
end
%% 图像重构
reI=[];
for numi=1:64
m=(numi-1)*512+1;
% 分成64个512*8阵列,每个阵列有64个8*8方阵
A=[];
for numj=1:64
n=(numj-1)*8;
A=[A Block(m+n:m+n+7,:)];
end
reI=[reI; A];
end
%% JPEG Figure
subplot(1,2,1);imshow(I./256);title('input');
subplot(1,2,2);imshow(reI./256);title('JPEG压缩');
imwrite(reI./256,'05 质量因子80.jpg');
%% CODE
%% 锯齿形 ZIG-ZAG 对每一个方阵采用ZIG-ZAG排序,以增加图像中的连0个数,得到4096x64的矩阵
% QBlock: 32768*8
% QLine: 4096*64
QLine=[];
load('JPEG512.mat','zigzag');%快速Z型排序行向量
zigzag = zigzag + 1; % 下标加1,从0开始
for num=1:4096
start=(num-1)*8+1;
A=reshape(QBlock(start:start+7,:),1,64);% 变成行向量
QLine=[QLine;A(zigzag)];
end
%% 对第一列的DC分量进行DPCM编码 第一个记为0,后面的都只记录与前者的差值
% QLine: 4096*64
% VLIDC: 4096*1
% 对第一列进行DPCM编码,第一个值记为DC,并赋0
DC=QLine(1,1);%保留备用
sumcode=0;%计算编码长度
QLine(1,1)=0;
for num=4096:-1:2
QLine(num,1)=QLine(num,1)-QLine(num-1,1);
end
VLIDC=ones(4096,1);% VLI分组
for num=1:4096
temp=abs(QLine(num,1));%用绝对值判断组别
if temp==0
VLIDC(num)=0;
else
for k=1:7%经测试,第一列最大值为80,前7组够用
if (temp>=2^(k-1)) && (temp<2^k)
VLIDC(num)=k;
break;
end
end
end
end
for num=1:4096
%先根据DC亮度huffman表计算sumcode
if (VLIDC(num)<=5) && (VLIDC(num)>=0)
sumcode=sumcode+3;
elseif VLIDC(num)==6
sumcode=sumcode+4;
else
sumcode=sumcode+5;
end
%再根据VLI表计算sumcode
sumcode=sumcode+VLIDC(num);
end
%% 对其余63列AC分量进行RLC编码
% QLine: 4096*64
% 经测试,后63列最大值为58,VLI前6组够用。
eob=max(QLine(:))+1; %设一个超大值作为每一行结束符
for numn=1:4096 %放eob
for numm=64:-1:2
if QLine(numn,numm)~=0
QLine(numn,numm+1)=eob;
break;
end
if (numm==2)%没找到
QLine(numn,2)=eob;
end
end
end
test=QLine';
[col,~]=find(test==eob);%我们只要eob列位置
validAC=col-1; %每一行保留的AC数据量,含EOB
maxcz=0;
for numn=1:4096 %逐行计算并加至sumcode
cz=[];%记录前0数
VLIAC=[];%记录组号
count=0;%记录连0数
for numm=2:1+validAC(numn)
if QLine(numn,numm)==eob
cz=[cz 0];
VLIAC=[VLIAC 0];
elseif QLine(numn,numm)==0
count=count+1;
else %遇到非0值
if count>15 %遇到连0大于15的
cz=[cz 15];
count=0;
VLIAC=[VLIAC 0];
continue;
end
cz=[cz count];
count=0;
temp=abs(QLine(numn,numm));%用绝对值判断组别
for k=1:6%经测试,后63列最大值为58,前6组够用
if (temp>=2^(k-1)) && (temp<2^k)
VLIAC=[VLIAC k];
break;
end
end
end
end%该行cz和VLIAC已定,开始计算
sumcode=sumcode+4;%EOB对应1010,就是4bit
czlen=length(cz)-1; %czlen不包括EOB
load('JPEG512.mat','codelength');%霍夫曼编码码长矩阵(AC、DC亮度编码表)
for k=1:czlen
if VLIAC(k)==0
sumcode=sumcode+11;
else
sumcode=sumcode+codelength(cz(k)+1,VLIAC(k));
end
end
end
%% 压缩率
OB=512*512*8;
CR=OB/sumcode;
D=I-reI;
MSE = sum(D(:).*D(:))/prod(size(I));
disp(['原图 Bit: ',num2str(OB),' bit']);
disp(['压缩图像 Bit: ',num2str(sumcode),' bit']);
disp(['压缩比: ',num2str(CR)]);
disp(['均方根误差: ',num2str(MSE)]);
end
没有合适的资源?快使用搜索试试~ 我知道了~
【图像压缩】Matlab实现JPEG编码压缩.zip
共28个文件
jpg:25个
png:1个
m:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 13 下载量 103 浏览量
2022-06-14
19:14:19
上传
评论 6
收藏 1.66MB ZIP 举报
温馨提示
首先介绍了基于离散余弦变换的JPEG图像压缩编码算法,接着用MATLAB6.5对标准灰度图像进行仿真,并对同一幅Lena图像做不同的压缩,绘制了率失真曲线.实验结果表明,在很大的压缩范围内,在不同的压缩比和编码比特率下,重建图像的峰值信噪比都在30dB以上,仍然能满足人们的视觉需要.对图像做不同的压缩,满足了不同的场合,不同的控制码率下要求不同的图像质量的实际需要.用MATLAB做仿真实验,方法简单而且误差小,大大提高了图像压缩的效率和精度.
资源推荐
资源详情
资源评论
收起资源包目录
【图像压缩】Matlab实现JPEG编码压缩 上传版本.zip (28个子文件)
05 质量因子20.jpg 24KB
04 质量因子20.jpg 28KB
03 灰度图.jpg 50KB
05 质量因子80.jpg 30KB
02 质量因子20.jpg 9KB
03 质量因子80.jpg 40KB
04 灰度图.jpg 27KB
02.jpg 54KB
01.jpg 126KB
04 质量因子80.jpg 36KB
02 质量因子60.jpg 34KB
03.jpg 83KB
03 质量因子60.jpg 51KB
04.jpg 81KB
01 质量因子60.jpg 75KB
01 质量因子20.jpg 53KB
01 灰度图.jpg 74KB
02 灰度图.jpg 9KB
01 质量因子80.jpg 64KB
03 质量因子20.jpg 31KB
05.jpg 76KB
JPEG512.mat 211KB
05 灰度图.jpg 38KB
04 质量因子60.jpg 48KB
JPEG.m 5KB
02 质量因子80.jpg 16KB
05 质量因子60.jpg 40KB
2.png 417KB
共 28 条
- 1
天天Matlab科研工作室
- 粉丝: 2w+
- 资源: 7251
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页