7  图像压缩编码

7 图像压缩编码

Scroll Down

图像压缩编码

  1. 实验内容
    (1)基于游程编码的图像压缩。
    (2)基于离散余弦变换的图像压缩。
  1. 基本要求
    理解游程编码原理,掌握其实现方法;理解离散余弦变换编码原理,掌握其实现方法;对实验结果进行分析,得出实验结论并撰写实验报告。

注意:

实验(1)

使用给定的图像lena做实验,采用im2bw把灰度图像转换为二值图像,参考教材145页至146页的程序例7.4,试计算二值化时阈值分别取0.2,0.4,0.6的压缩比是多少?

1.	 %清理  
2.	clc;  
3.	close all;  
4.	clear all;  
5.	  
6.	figure();  
7.	img = imread('lena.jpg');  
8.	subplot(221);  
9.	imshow(img);  
10.	title('实验人:戚浩强');  
11.	xlabel('(a) 原图像');  
12.	  
13.	BW = im2bw(img,0.2); %对图像二值化  
14.	[zipped,info] = RLEencode(BW); %调用RLEencode函数对BW进行游程编码  
15.	unzipped = RLEdecode(zipped,info); %调用RLEdencode函数对zipped进行游程解码  
16.	subplot(222);  
17.	imshow(uint8(unzipped)*255); %显示二值图像经编解码后的图像  
18.	title('实验人:戚浩强');  
19.	xlabel('(b) 二值化时阈值为0.2经游程编解码后的图像');  
20.	cr1 = info.ratio; %显示压缩比  
21.	  
22.	BW = im2bw(img,0.4); %对图像二值化  
23.	[zipped,info] = RLEencode(BW); %调用RLEencode函数对BW进行游程编码  
24.	unzipped = RLEdecode(zipped,info); %调用RLEdencode函数对zipped进行游程解码  
25.	subplot(223);  
26.	imshow(uint8(unzipped)*255); %显示二值图像经编解码后的图像  
27.	title('实验人:戚浩强');  
28.	xlabel('(c) 二值化时阈值为0.4经游程编解码后的图像');  
29.	cr2 = info.ratio; %显示压缩比  
30.	  
31.	BW = im2bw(img,0.6); %对图像二值化  
32.	[zipped,info] = RLEencode(BW); %调用RLEencode函数对BW进行游程编码  
33.	unzipped = RLEdecode(zipped,info); %调用RLEdencode函数对zipped进行游程解码  
34.	subplot(224);  
35.	imshow(uint8(unzipped)*255); %显示二值图像经编解码后的图像  
36.	title('实验人:戚浩强');  
37.	xlabel('(d) 二值化时阈值为0.6经游程编解码后的图像');  
38.	cr3 = info.ratio; %显示压缩比  
39.	  
40.	function [zipped,info]=RLEencode(vector)  
41.	[m,n] = size(vector); %获取图像的高度和宽度  
42.	vector = uint8(vector(:)); %转换为整型  
43.	L = length(vector); %得到元素个数  
44.	c = double(vector(1)); %获取第一个像素值  
45.	e(1,1) = c; %游程矩阵第1列的值  
46.	e(1,2) = 0; %游程矩阵第2列为游程长度  
47.	t1 = 1; %游程矩阵下标变量  
48.	for j = 1:L %对图像所有元素循环处理  
49.	    if(vector(j) == c) %如果值不变  
50.	        e(t1,2) = e(t1,2) + 1; %将游程长度加1  
51.	    else %如果值改变  
52.	        c = vector(j); %记录新的值  
53.	        t1 = t1 + 1; %游程矩阵下标向量加1  
54.	        e(t1,1) = c; %游程矩阵第1行第1列的值  
55.	        e(t1,2) = 1; %游程矩阵新1行第2列的值(游程长度)  
56.	    end  
57.	end  
58.	zipped = e; %游程矩阵  
59.	info.rows = m; %记录原图像的高度  
60.	info.cols = n; %记录原图像的宽度  
61.	[m,n] = size(e); %获取游程矩阵的高度和宽度  
62.	info.ratio = (info.rows * info.cols) / (m * n); %显示压缩比  
63.	end  
64.	  
65.	function unzipped = RLEdecode(zip,info)  
66.	[m,n] = size(zip); %获取游程矩阵的高度和宽度  
67.	unzipped = [ ]; %解压矩阵初始化  
68.	for i = 1:m %对游程矩阵的每一行循环处理  
69.	    section = repmat(uint8(zip(i,1)),1,zip(i,2)); %第i行复制还原  
70.	    unzipped = [unzipped section]; %与矩阵前面的部分进行拼接  
71.	end  
72.	unzipped = reshape(unzipped, info.rows, info.cols);  
73.	end  

image.png

实验(2)

以所给lena图像为例,采用dct进行图像压缩编码,参考教材158页的程序,其中模板矩阵mask分别设置为
mask = [1 1 1 1 1 0 0 0;1 1 1 1 0 0 0 0;1 1 1 0 0 0 0 0;1 1 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],
mask = [1 1 1 1 0 0 0 0;1 1 1 1 0 0 0 0;1 1 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],
mask = [1 1 1 0 0 0 0 0;1 1 1 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],

1.	clc;  
2.	close all;  
3.	clear all;  
4.	  
5.	figure();  
6.	img = imread('lena.jpg');  
7.	subplot(221);  
8.	imshow(img);  
9.	title('实验人:戚浩强');  
10.	xlabel('(a) 原图像');  
11.	  
12.	mask1 = [1 1 1 1 1 0 0 0;1 1 1 1 0 0 0 0;1 1 1 0 0 0 0 0;1 1 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];  
13.	mask2 = [1 1 1 1 0 0 0 0;1 1 1 1 0 0 0 0;1 1 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];  
14.	mask3 = [1 1 1 0 0 0 0 0;1 1 1 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];  
15.	  
16.	img_d = im2double(img);  
17.	T = dctmtx(8);  
18.	B = blkproc(img_d,[8 8],'P1 * x * P2',T,T');  
19.	B2 = blkproc(B,[8 8],'P1 .* x',mask1);  
20.	img2 = blkproc(B2,[8 8],'P1 * x * P2',T',T);  
21.	e1 = Simg(img2,img_d);  
22.	subplot(222);  
23.	imshow(img2);  
24.	title('实验人:戚浩强');  
25.	xlabel('(b) 压缩解压图像的均方误差为0.0192');  
26.	  
27.	B2 = blkproc(B,[8 8],'P1 .* x',mask2);  
28.	img3 = blkproc(B2,[8 8],'P1 * x * P2',T',T);  
29.	e2 = Simg(img3,img_d);  
30.	subplot(223);  
31.	imshow(img3);  
32.	title('实验人:戚浩强');  
33.	xlabel('(c) 压缩解压图像的均方误差为0.0235');  
34.	  
35.	B2 = blkproc(B,[8 8],'P1 .* x',mask3);  
36.	img4 = blkproc(B2,[8 8],'P1 * x * P2',T',T);  
37.	e3 = Simg(img4,img_d);  
38.	subplot(224);  
39.	imshow(img4);  
40.	title('实验人:戚浩强');  
41.	xlabel('(d) 压缩解压图像的均方误差为0.0297');  
42.	  
43.	function e = Simg(img1,img2)  
44.	[M N] = size(img1);  
45.	%temp = 0;  
46.	%for i = 1:M  
47.	%    for j = 1:N  
48.	%        temp = temp +(img1(i,j) - img2(i,j)) * (img1(i,j) - img2(i,j)) ;  
49.	%    end  
50.	%end  
51.	e = sum(sum((img1 - img2) .* (img1 - img2)));  
52.	e = sqrt(e/(M * N));  
53.	end  

image.png

可以得到不同的压缩编码图像,
根据公式 ,编写程序计算原图像和上述三种模板下得到不同的压缩编码图像之间的均方误差。

用title在图像上方标明实验人,用xlabel在图像下方表明图像所对应的操作(参数),用subplot把每一个实验的图像放到同一个figure下
观察实验结果并进行分析,写出实验结论

结论

如图1.1(b)、(c)和(d)分别是二值化阈值取0.2,0.4和0.6所得的图像。
image.png
cr1,cr2和cr3分别对应其压缩比,可见游程编码对二值图像的压缩比非常高,而随着二值化阈值取值的增大,压缩比也随之增大。
如图1.2中(b)、(c)和(d)是分别取 不同的mask矩阵所得的图像,可以看出经压缩解压后的图像在显示上的变化不是很明显。
image.png
e1、e2和e3分别对应其均方误差。