1、实验四 JPEG压缩一、 实验原理1、 数据分块对图像进行编码前,将每个分量图像分割成不重叠的88像素块, 每一个88像素块称为一个数据单元(DU)。在彩色图像中, JPEG分别压缩图像的每个彩色分量。虽然JPEG可以压缩通常的红绿蓝分量,但在YCbCr空间的压缩效果会更好。这是因为人眼对色彩的变化不如对亮度的变化敏感,因而对色彩的编码可以比对亮度的编码粗糙些,这主要体现在不同的采样频率和量化精度上。因此,编码前一般先将图像从RGB空间转换到YCbCr空间,再把各分量图像分割成88数据块。 在对图像采样时,可以采用不同的采样频率,这种技术称为二次采样。由于亮度比色彩更重要,因而对Y分量的采样频
2、率可高于对Cb、Cr的采样频率,这样有利于节省存储空间。常用的采样方案有YUV422和YUV411。把采样频率最低的分量图像中一个DU所对应的像区上覆盖的所有各分量上的DU按顺序编组为一个最小编码单元(MCU)。对灰度图像而言,只有一个Y分量,MCU就是一个数据单元。而对彩色图像而言,以4:1:1的采样方案为例,则一个MCU由4个Y分量的DU、1个Cb分量的DU和1个Cr分量的DU组成。2、 DCT处理图像数据块分割后,即以MCU为单位顺序将DU进行二维离散余弦变换。对以无符号数表示的具有P位精度的输入数据, 在DCT前要减去2P-1,转换成有符号数,而在IDCT后,应加上2P-1,转换成无符
3、号数。对每个88的数据块DU进行DCT后, 得到的64个系数代表了该图像块的频率成分,其中低频分量集中在左上角, 高频分量分布在右下角。系数矩阵左上角的叫做直流(DC)系数,它代表了该数据块的平均值,其余63个叫交流(AC)系数。 3、系数量化 在DCT处理中得到的64个系数中,低频分量包含了图像亮度等主要信息。在从空间域到频域的变换中,图像中的缓慢变化比快速变化更易引起人眼的注意, 所以在重建图像时,低频分量的重要性高于高频分量。因而在编码时可以忽略高频分量, 从而达到压缩的目的,这也是量化的根据和目的。在JPEG标准中,用具有64个独立元素的量化表来规定DCT域中相应的64个系数的量化精度
4、,使得对某个系数的具体量化阶取决于人眼对该频率分量的视觉敏感程度。理论上,对不同的空间分辨率、数据精度等情况,应该有不同的量化表。不过,一般采用下图所示的量化表,可取得较好的视觉效果。之所以用两张量化表,是因为Y分量比Cb和Cr更重要些,因而对Y采用细量化,而对Cb和Cr采用粗量化。量化就是用DCT变换后的系数除以量化表中相对应的量化阶后四舍五入取整。由于量化表中左上角的值较小,而右下角的值较大, 因而起到了保持低频分量、 抑制高频分量的作用。 亮度量化表色度量化表4、 Z型扫描DCT系数量化后,构成一个稀疏矩阵,用Z(Zigzag)形扫描将其变成一维数列,将有利于熵编码。Z形扫描的顺序如图:
5、5、 DC系数编码DC系数反映了一个88数据块的平均亮度,一般与相邻块有较大的相关性。JPEG对DC系数作差分编码,即用前一数据块的同一分量的DC系数作为当前块的预测值,再对当前块的实际值与预测值的差值作哈夫曼编码。 若DC系数的动态范围为-1024+1024,则差值的动态范围为-2047+2047。如果为每个差值赋予一个码字, 则码表过于庞大。因此,JPEG对码表进行了简化,采用“前缀码(SSSS)+尾码”来表示。前缀码指明了尾码的有效位数B, 可以根据DIFF从表10-8中查出前缀码对应的哈夫曼编码。尾码的取值取决于DC系数的差值和前缀码。如果DC系数的差值DIFF大于等于0,则尾码的码字
6、为DIFF的B位原码;否则,取DIFF的B位反码。 6、 AC系数编码经Z形排列后的AC系数,更有可能出现连续0组成的字符串, 从而对其进行行程编码将有利于压缩数据。JPEG将一个非零DC系数及其前面的0行程长度(连续0的个数)的组合称为一个事件。将每个事件编码表示为“NNNN/SSSS+尾码”, 其中, NNNN为0行程的长度,SSSS表示尾码的有效位数B(即当前非0系数所占的比特数),如果非零AC系数大于等于0, 则尾码的码字为该系数的B位原码, 否则, 取该系数的B位反码。 由于只用4位表示0行程的长度,故在JPEG编码中,最大0行程只能等于15。当0行程长度大于16时,需要将其分开多次
7、编码, 即对前面的每16个0以“F/0”表示,对剩余的继续编码。 二、 实验内容实现基本JPEG的压缩和编码分三个步骤:(1)首先通过DCT变换去除数据冗余;(2)使用量化表对DCT系数进行量化;(3)对量化后的系数进行Huffman编码。三、实验结果实验图片:Lena.bmpLenaRGB.bmp都是灰度图像压缩比:彩色图像压缩比:程序:%AC_Huffman.mfunction ACH = AC_Huffman(AC,n); %亮度AC系数码表 T1=1010 00 01 100 1011 11010 1111000 11111000 1111110110 1111111110000010
8、 1111111110000011; 1100 11011 1111001 111110110 11111110110 1111111110000100 1111111110000101 1111111110000110 1111111110000111 1111111110001000 0; 11100 11111001 1111110111 111111110100 1111111110001001 1111111110001010 1111111110001011 1111111110001100 1111111110001101 1111111110001110 0; 111010 1
9、11110111 111111110101 1111111110001111 1111111110010000 1111111110010001 1111111110010010 1111111110010011 1111111110010100 1111111110010101 0; 111011 1111111000 1111111110010110 1111111110010111 1111111110011000 1111111110011001 1111111110011010 1111111110011011 1111111110011100 1111111110011101 0;
10、 1111010 11111110111 1111111110011110 1111111110011111 1111111110100000 1111111110100001 1111111110100010 1111111110100011 1111111110100100 1111111110100001 0; 1111011 111111110110 1111111110100110 1111111110100111 1111111110101000 1111111110101001 1111111110101010 1111111110101011 1111111110101100
11、1111111110101101 0; 11111010 111111110111 1111111110101110 1111111110101111 1111111110110000 1111111110110001 1111111110110010 1111111110110011 1111111110110100 1111111110110101 0; 111111000 111111111000000 1111111110110110 1111111110110111 1111111110111000 1111111110111001 1111111110111010 11111111
12、10111011 1111111110111100 1111111110111101 0; 111111001 1111111110111110 1111111110111111 1111111111000000 1111111111000001 1111111111000010 1111111111000011 1111111111000100 1111111111000101 1111111111000110 0; 111111010 1111111111000111 1111111111001000 1111111111001001 1111111111001010 1111111111
13、001011 1111111111001100 1111111111001101 1111111111001110 1111111111001111 0; 1111111001 1111111111010000 1111111111010001 1111111111010010 1111111111010011 1111111111010100 1111111111010101 1111111111010110 1111111111010111 1111111111011000 0; 1111111010 1111111111011001 1111111111011010 1111111111
14、011011 1111111111011100 1111111111011101 1111111111011110 1111111111011111 1111111111100000 1111111111100001 0; 11111111000 1111111111100010 1111111111100011 1111111111100100 1111111111100101 1111111111100110 1111111111100111 1111111111101000 1111111111101001 1111111111101010 0; 1111111111101011 111
15、1111111101100 1111111111101101 1111111111101110 1111111111101111 1111111111110000 1111111111110001 1111111111110010 1111111111110011 1111111111110100 0; 11111111001 1111111111110101 1111111111110110 1111111111110111 1111111111111000 1111111111111001 1111111111111010 1111111111111011 1111111111111100
16、 1111111111111101 1111111111111111; %色度AC系数码表 T2=00 01 100 1010 11000 11001 111000 1111000 111110100 1111110110 111111110100; 1011 111001 11110110 111110101 11111110110 111111110101 1111111110001000 1111111110001001 1111111110001010 1111111110001011 0; 11010 11110111 1111110111 111111110110 11111111
17、1000010 1111111110001100 1111111110001101 1111111110001110 1111111110001111 1111111110010000 0; 11010 111110111 1111110111 11111110110 1111111110010001 1111111110010010 1111111110010011 1111111110010100 1111111110010101 1111111110010110 0; 111010 111110110 1111111110010111 1111111110011000 111111111
18、0011001 1111111110011010 1111111110011011 1111111110011100 1111111110011101 1111111110011110 0; 111011 1111111001 1111111110011111 1111111110100000 1111111110100001 1111111110100010 1111111110100011 1111111110100100 1111111110100101 1111111110100010 0; 1111001 11111110111 1111111110100111 1111111110
19、101000 1111111110101001 1111111110101010 1111111110101011 1111111110101100 1111111110101101 1111111110101110 0; 1111010 11111111000 1111111110101111 1111111110110000 1111111110110001 1111111110110010 1111111110110011 1111111110110100 1111111110110101 1111111110110110 0; 11111001 1111111110110111 111
20、1111110111000 1111111110111001 1111111110111010 1111111110111011 1111111110111100 1111111110111101 1111111110111110 1111111110111111 0; 111110111 1111111111000000 1111111111000001 1111111111000010 1111111111000011 1111111111000100 1111111111000101 1111111111000110 1111111111000111 1111111111001000 0
21、; 111111000 1111111111001001 1111111111001010 1111111111001011 1111111111001100 1111111111001101 1111111111001110 1111111111001111 1111111111010000 1111111111010001 0; 111111001 1111111111010010 1111111111010011 1111111111010100 1111111111010101 1111111111010110 1111111111010111 1111111111011000 111
22、1111111011001 1111111111011010 0; 111111010 1111111111011011 1111111111011100 1111111111011101 1111111111011110 1111111111011111 1111111111100000 1111111111100001 1111111111100010 1111111111100011 0; 11111111001 1111111111100100 1111111111100101 1111111111100110 1111111111100111 1111111111101000 111
23、1111111101001 1111111111101010 1111111111101011 1111111111101100 0; 11111111100000 1111111111101101 1111111111101110 1111111111101111 1111111111110000 1111111111110001 1111111111110010 1111111111110011 1111111111110100 1111111111110101 0; 1111111010 111111111000011 1111111111110110 1111111111110111
24、1111111111111000 1111111111111001 1111111111111010 1111111111111011 1111111111111100 1111111111111101 1111111111111111; %RLC行程编码 k=0; j=1; for i=1:63 if AC(i)=0 & k2) if (RLC(length(RLC) = 0) & (RLC(length(RLC)-2) = 0) RLC = RLC(1:length(RLC)-2); RLC(length(RLC)-1) = 0; else break end end ACH=; for
25、i=1:2:length(RLC) NNNN=RLC(i); if RLC(i+1)=0 SSSS=0; elseif abs(RLC(i+1)=1 SSSS=1; elseif ( abs(RLC(i+1)=2 & abs(RLC(i+1)=4 & abs(RLC(i+1)=8 & abs(RLC(i+1)=16 & abs(RLC(i+1)=32 & abs(RLC(i+1)=64 & abs(RLC(i+1)=128 & abs(RLC(i+1)=256 & abs(RLC(i+1)=512 & abs(RLC(i+1)=0 S2=dec2bin(RLC(i+1); else S2=de
26、c2bin(abs(RLC(i+1); for i=1:length(S2) if S2(i)=1 S2(i)=0; else S2(i)=1; end end end end ACH=ACH S1 S2; end%DC_Huffman.mfunction DCH = DC_Huffman(Z,last_Z,n); %亮度码字 T1 = 00 010 011 100 101 110 1110 11110 111110 1111110 11111110 111111110; %色度码字 T2 = 00 01 10 110 1110 11110 111110 1111110 11111110 11
27、1111110 1111111110 11111111110; DIFF = Z-last_Z; if DIFF = 0 SSSS = 0; elseif (abs(DIFF) = 1) SSSS = 1; elseif (abs(DIFF) = 2 & abs(DIFF)= 4 & abs(DIFF)= 8 & abs(DIFF)= 16 & abs(DIFF)= 32 & abs(DIFF)= 64 & abs(DIFF)= 128 & abs(DIFF)= 256 & abs(DIFF)= 512 & abs(DIFF)= 1024 & abs(DIFF)= 0 S2 = dec2bin
28、(DIFF); else S2 = dec2bin(DIFF); for i = 1:length(S2) if S2(i) = 0; S2(i) = 1; else S(2) = 0; end end end DCH = S1 S2;%exp4.mclear all; close all; %亮度量化表 LQT=16 11 10 16 24 40 51 61; 12 12 14 19 26 58 60 55; 14 13 16 24 40 57 69 56; 14 17 22 29 51 87 80 62; 18 22 37 56 68 109 103 77; 24 35 55 64 81
29、104 113 92; 49 64 78 87 103 121 120 101; 72 92 95 98 112 100 103 99; %色度量化表 CQT=17 18 24 47 99 99 99 99; 18 21 26 66 99 99 99 99; 24 26 56 99 99 99 99 99; 47 66 99 99 99 99 99 99; 99 99 99 99 99 99 99 99; 99 99 99 99 99 99 99 99; 99 99 99 99 99 99 99 99; 99 99 99 99 99 99 99 99; %灰度图象处理 I1 = double(
30、imread(Lena.bmp); M,N = size(I1); last_Z = 0; jpeg1 = ; for i = 0:M/8-1 for j = 0:N/8-1 S = I1(1+8*i):(8*(i+1), (1+8*j):(8*(j+1);%分割成8*8处理 S = dct2(S);%DCT S = round(S./LQT);%亮度量化 Z = Zigzag(S);%Zigzag扫描 DCH = DC_Huffman(Z(1),last_Z,1);%直流分量编码 ACH = AC_Huffman(Z(2:end),1);%交流分量编码 last_Z = Z(1); jpeg
31、1 = jpeg1 DCH ACH; end end rate1 = 8*M*N/length(jpeg1);%压缩比 %彩色图像处理 I2 = double(imread(LenaRGB.bmp); %转换成亮度 I2 = rgb2ycbcr(I2); Y = I2(:,:,1); Cr = I2(:,:,2); Cb = I2(:,:,3); M,N = size(Y); Y_last_Z = 0; Cr_last_Z = 0; Cb_last_Z = 0; Y_jpeg2 = ; Cr_jpeg2 = ; Cb_jpeg2 = ; for i = 0:M/8-1 for j = 0:N/
32、8-1 S1 = Y(1+8*i):(8*(i+1), (1+8*j):(8*(j+1);%分割成8*8处理 S2 = Cr(1+8*i):(8*(i+1), (1+8*j):(8*(j+1); S3 = Cb(1+8*i):(8*(i+1), (1+8*j):(8*(j+1); S1 = dct2(S1);%DCT S2 = dct2(S2); S3 = dct2(S3); S1 = round(S1./LQT);%亮度量化 S2 = round(S2./CQT);%色度量化 S3 = round(S3./CQT);%色度量化 Z1 = Zigzag(S1);%Zigzag扫描 Z2 = Z
33、igzag(S2); Z3 = Zigzag(S3); DCH_Y = DC_Huffman(Z1(1),Y_last_Z,1);%直流分量编码 DCH_Cr = DC_Huffman(Z2(1),Cr_last_Z,2); DCH_Cb = DC_Huffman(Z3(1),Cb_last_Z,2); ACH_Y = AC_Huffman(Z1(2:end),1);%交流分量编码 ACH_Cr = AC_Huffman(Z2(2:end),2); ACH_Cb = AC_Huffman(Z3(2:end),2); Y_last_Z = Z1(1); Cr_last_Z = Z2(1); Cb
34、_last_Z = Z3(1); Y_jpeg2 = Y_jpeg2 DCH_Y ACH_Y; Cr_jpeg2 = Cr_jpeg2 DCH_Cr ACH_Cr; Cb_jpeg2 = Cb_jpeg2 DCH_Cb ACH_Cb; end end jpeg2 = Y_jpeg2,Cr_jpeg2,Cb_jpeg2; rate2 = 8*M*N*3/length(jpeg2);%压缩比Zigzag.mfunction Z = Zigzag(S); %Zigzag表 ZT=0 ,1 ,5 ,6 ,14,15,27,28; 2 ,4 ,7 ,13,16,26,29,42; 3 ,8 ,12,17,25,30,41,43; 9 ,11,18,24,31,40,44,53; 10,19,23,32,39,45,52,54; 20,22,33,38,46,51,55,60; 21,34,37,47,50,56,59,61; 35,36,48,49,57,58,62,63; Z = zeros(1,64); for i = 1:8 for j = 1:8 Z(ZT(i,j)+1) = S(i,j); end end
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922