- 实验目的
1、理解有损压缩和无损压缩的概念:
2、理解图像压缩的主要原则和目的:
3、利用MATLAB程序进行图像压缩。
二、实验环境
硬件:一般PC机
操作系统:WindowsXP
编程平台:MATLAB或高级语言
三、实验原理
1、有损压缩和无损压缩的基本流程和基本理论
2、Huffman编码的基本方法
3、JPEG压缩标准基本理论
1、下图是典型的变换编码流程和方法,其采用了DCT变换对256级灰度图进行压缩处理,请实现其过程,并进行以下处理和分析:
(1)对图像进行8X8分块处理并作DCT变换,观察图像8X8子块的DCT系数的分布,并分析其特点;
(2)对DCT系数进行量化及反量化处理,求反量化系数的逆DCT变换,重新显示重建图像、误差图像和误差图像的直方图;
(3)将量化步长分别增大为初始值的2倍、4倍、8倍后再进行DCT变换编码,显示不同量化步长条件下的重建图像、误差图像以及误差图像的直方图。分析重建图像质量和量化步长的关系。
%增加量化步长(N分别为2,4,8)
clc;
clear all
% 读取图像并转换为灰度图像
I0 = imread('E:\hg.jpg');
I = rgb2gray(I0);
% JPEG量化矩阵
jpeg = [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 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99]*4;
% 预分配数组
I1 = zeros(size(I));
I2 = zeros(size(I));
I3 = zeros(size(I));
% 确保处理的块在图像范围内
[row, col] = size(I);
for m = 1:8:row-7
for n = 1:8:col-7
J = I(m:m+7, n:n+7);
I1(m:m+7, n:n+7) = dct2(J);
I2(m:m+7, n:n+7) = round(I1(m:m+7, n:n+7) ./ jpeg);
I2(m:m+7, n:n+7) = I2(m:m+7, n:n+7) .* jpeg;
I3(m:m+7, n:n+7) = idct2(I2(m:m+7, n:n+7));
end
end
% 转换数据类型
I3 = uint8(I3);
% 显示图像
figure;
subplot(221); imshow(I); title('原图像');
subplot(222); imshow(I1, []); title('经DCT变化的图像');
subplot(223); imshow(I2, []); title('对经DCT变化的图像进行量化');
subplot(224); imshow(I3); title('反量化的图像');
% 计算误差图像并显示
I4 = I - I3;
figure;
subplot(211); imshow(I4, []); title('误差图像');
subplot(212); imhist(I4); title('误差直方图');
参考p368-373,实现16×16分块离散余弦变换(DCT)编码,用zigzag方式保留每一块的前10个和前21个系数,再进行DCT解码,即通过去掉DCT变换部分系数而实现压缩。编写程序并分别显示解码后的两个图。
I=imread('E:\hg.jpg');
i=rgb2gray(I);
i=im2double(i);
mask1=[1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 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
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 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 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ];
mask2=[1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 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
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 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 ];
T=dctmtx(16);
B=blkproc(i,[16 16],'P1*x*P2',T,T');
i1=blkproc(B,[16 16],'P1.*x',mask1);
i2=blkproc(B,[16 16],'P1.*x',mask2);
ii1=blkproc(i1,[16 16],'P1*x*P2',T',T);
ii2=blkproc(i2,[16 16],'P1*x*P2',T',T);
figure,
subplot(121);imshow(ii1); title('第一种压缩比(mask1)');
subplot(122);imshow(ii2); title('第一种压缩比(mask2)');
用imwrite(原始图像,目标图像,'quality',比率)命令对灰度图实现质量为10、30、50、75、90的JPEG压缩。
I=imread('E:\hg.jpg');
imwrite(I,'test1.jpg','quality',10);
J1 = imread('test1.jpg');
imwrite(I,'test2.jpg','quality',30);
J2 = imread('test2.jpg');
imwrite(I,'test3.jpg','quality',50);
J3 = imread('test3.jpg');
imwrite(I,'test4.jpg','quality',75);
J4 = imread('test4.jpg');
imwrite(I,'test2.jpg','quality',90);
J5 = imread('test2.jpg');
subplot(2,3,1),imshow(I); title('原图')
subplot(2,3,2),imshow(J1); title('压缩 quality=10')
subplot(2,3,3),imshow(J2); title('压缩 quality=30')
subplot(2,3,4),imshow(J3); title('压缩 quality=50')
subplot(2,3,5),imshow(J4); title('压缩 quality=75')
subplot(2,3,6),imshow(J5); title('压缩 quality=90')