实验二 JEPG 图像编码
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0
0
0 0 0 0 0 1 0 0
0
0
0
0
0];
显示的结果就是:
图 4 若 I1
= [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0
0
0
0
0
0
1];
结果如下:
18
实验二 JEPG 图像编码
图 5
(3) 根据 JPEG 标准对标准测试图像做 DCT 变换,并队 DCT 系数进行量化(选择量化
步长为 8);然后做反了量化和反变换,得到重建图像,比较原始图像和重建图像的 差别。
该实验的源代码如下: %读入指定途径的图像
rgb=imread('D:\\MATLAB6p5\\work\\test.jpg'); %RGB 转换为 YUV,即 YCbCr yuv=rgb2ycbcr(rgb);
%将得到的 YUV 转换为可进行数学运算的 double 类型,原来为 uint8 类型 yuv=double(yuv);
%分别提取其中的 Y,U,V 矩阵 y=yuv(:,:,1); u=yuv(:,:,2); v=yuv(:,:,3);
%设定量化步长 eql=8;
%将 Y,U,V 矩阵分割为 8*8 的小块,并对每个小块进行 DCT 变换 y_dct=blkproc(y,[8,8],'P1*x*P2',T, T'); u_dct=blkproc(u,[8,8],'P1*x*P2',T, T'); v_dct=blkproc(v,[8,8],'P1*x*P2',T, T'); %设定块操作时 dct 矩阵 T = dctmtx(8);
%将得到的 DCT 系数除以量化步长 y_dct=y_dct/eql;
u_dct=u_dct/eql;
19
实验二 JEPG 图像编码
v_dct=v_dct/eql;
%将量化后的系数四舍五入 y_dct_c=fix(y_dct); u_dct_c=fix(u_dct); v_dct_c=fix(v_dct);
%反量化
y_dct_c=y_dct_c*eql; u_dct_c=u_dct_c*eql; v_dct_c=v_dct_c*eql;
%进行 DCT 反变换
y_idct=blkproc(y_dct_c,[8,8],'P1*x*P2', T^-1,(T')^-1); u_idct=blkproc(u_dct_c,[8,8],'P1*x*P2', T^-1,(T')^-1); v_idct=blkproc(v_dct_c,[8,8],'P1*x*P2', T^-1,(T')^-1); %恢复为 YUV 矩阵,转换为 uint8 类型, yuv(:,:,1)=y_idct; yuv(:,:,2)=u_idct; yuv(:,:,3)=v_idct; yuv=uint8(yuv); %YUV 转换为 RGB rgb1=ycbcr2rgb(yuv); %显示两幅图像
subplot(211),imshow(rgb),title('原始图像'); subplot(212),imshow(rgb1),title('处理后图像');
运行程序后,得到的结果如下图显示:
原始图像
处理后图像
图 6 实验 c——内容 1
将测试图片替换,有
20
原始图像
实验二 JEPG 图像编码
处理后图像
图 7 实验C——内容 2
由实验的结果可知,在量化步长为 8 的情况下,根据处理前后图像的对比,尽管损 失了一些图像信息,但是基本上和与原图差别不大。
(4) 改变量化步长,重复步骤(3)观察量化步长对图像质量的影响。
将实验(3)中源程序中的量化步长 eql=32,重复该实验,得到如下的结果:
原始图像
处理后图像
图 8 实验 D——内容 1 原始图像 处理后图像
21