- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一种基于MATLAB的JPEG图像压缩具体实现方法
说明:该方法主要是对FPGA硬件实现编码的一个验证,MATLAB处理时尽量选择了简单化和接近硬件实现需要。
JPEG编码解码流程:BMP图像输入、8*8分块、DCT变换、量化、Zig_Zag扫描、获取DC/AC系数中间格式、Huffman熵编码、DC/AC系数Huffman熵解码,反zig_zag扫描、反量化、反DCT变换、8*8组合、解码图像显示。
下面根据具体代码解释实现过程。
1.BMP图像输入
A=imread(messi_b.bmp); %读取BMP图像矩阵
R=int16(A(:,:,1))-128; %读取RGB矩阵,由于DCT时输入为正负输入,
G=int16(A(:,:,2))-128; %使得数据分布范围-127——127
B=int16(A(:,:,3))-128;
通过imread函数获取BMP图像的R、G、B三原色矩阵,因为下一步做DCT转换,二DCT函数要求输入为正负值,所以减去128,使得像素点分布范围变为-127~127,函数默认矩阵A的元素为无符号型(uint8),所以如果直接相减差值为负时会截取为0,所以先用int16将像素点的值转为带符号整数。网上很多都提到了第一步的YUV转换,但是由于MATLAB在实验时YUV转换后色差失真比较严重,这里没有进行YUV转换。个人理解为YUV转换后经过非R/G/B原理显示器显示效果可能会比较好,或者如果图像有色差可以选择YUV调整。为了方便,读入的图像像素为400*296,是8*8的50*37倍,所以代码里没有进行8*8的整数倍调整。
2. 8*8分块
R_8_8=R(1:8,1:8);%取出一个8*8块
这里以R色压缩解码为例,后边解释均为R色编码解码过程,最后附全部代码。R_8_8为:
3.DCT变换
R_DCT=dct2(R_8_8);
使用MATLAB函数dct2进行DCT变换,也可使用DCT变换矩阵相乘的方法,即R_DCT=A* R_8_8*AT,其中A为DCT变换矩阵。R_DCT为:
4.量化
R_dct_s=round(R_DCT./S);
使用JPEG标准亮度量化表S量化并取整,S为:
R_dct_s为:
其中第一个数-14为DC系数,剩余63个数为AC系数,左上角低频,右下角高频,可以看出量化后已经将多数高频量丢弃,从而实现数据压缩。
5.Zig_Zag扫描
Rdcts_c=reshape(R_dct_s,1,64);
Rdcts_c_z=Rdcts_c(zig);
利用reshape函数将量化后的矩阵转为[1,64]行向量,利用zig向量按位取值,进行Zig_Zag扫描。其中Rdcts_c为:
11~64位均为0;
zig为:
zig=[0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63];
Zig_Zag扫描后的向量Rdcts_c_z为:
11~64位均为0;
可以看出通过zig向量按位取值准确实现了对量化后DC,AC系数的Zig_Zag扫描。
6.获取DC/AC系数的中间格式
r_dc_diff=Rdcts_c_z(1)-r_dc;
用当前DC系数减去上一个8*8子块的DC系数得到两DC系数的差值作为DC系数中间值,因为图像相邻像素具有很大的相关性,这样做可以减小DC编码长度,进一步压缩代码,在解码的时候通过该差值依次获得各8*8子块DC系数。
r_dc=Rdcts_c_z(1);
解码之后用该代码将当前DC系数赋给r_dc作为下一次编码时求差值的参考值。
for i=2:1:64;
if Rdcts_c_z(i)==0r_n15i~=64
r_n=r_n+1;
elseif Rdcts_c_z(i)==0r_n15i==64
r_ac_cnt=r_ac_cnt+1;
r_AC(1,2*r_ac_cnt-1)=r_n;
r_AC(1,2*r_ac_cnt)=Rdcts_c_z(i);
r_n=0;
elseif Rdcts_c_z(i)~=0r_n15
r_ac_cnt=r_ac_cnt+1;
r_AC(1,2*r_ac_cnt-1)=r_n;
r_AC(1,2*r_ac_cnt)=Rdcts_c_z(i);
您可能关注的文档
最近下载
- 010-数学形态学分析.ppt
- 2023年芜湖市镜湖区市场监督管理局招考工作人员笔试参考题库(共500题)答案详解版.docx VIP
- 励志班会:985博导桂海潮案例,读书可以改变命运主题班会.pptx
- Haier海尔洗衣机EG10014BD809LGU1使用说明书手册参数图解图示pdf电子版下载.pdf VIP
- 《中职高考英语总复习与同步练》(总复习分册)教案 第11课 语法知识——专题9 非谓语动词.docx VIP
- 供应室泛水应急演练.pptx VIP
- 化学品管理中的供应链安全和可追溯性.pptx
- 小学四年级上册心理健康教育教案.doc
- 《中职高考英语总复习与同步练》(总复习分册)教案 第8课 语法知识——专题7 形容词和副词(2).docx VIP
- 【方书】中医土单验方一百首(高清版).pdf
文档评论(0)