清华大学电子工程系
MATLAB综合实验报告
实验四 图像处理综合实验
班级 无84 学号 2008011146 姓名 吴文昊 实验日期2010.8.25 交报告日期2010.9.4
目录
第一章 基础知识 ............................................................................................................................. 3 第二章 图像压缩编码 ..................................................................................................................... 3 第三章 信息隐藏 ........................................................................................................................... 10 第四章 人脸检测 ........................................................................................................................... 13 附:本实验中的脚本、自定义函数,资源文件以及测试图像文件目录 ................................. 24
第一章 基础知识
1. MATLAB提供了图像处理工具箱,在命令窗口中输入help images可查看该工具箱内所有
函数。请阅读并大致了解这些函数的基本功能。 2. 利用MATLAB提供的Image I/O函数分别完成以下处理:
(a) 以测试图像的中心为圆心,图像的长和宽中较小值的一半为半径画一个红颜色的
圆;
(b) 将测试图像涂成国际象棋状的“黑白格”的样子,其中“黑”即黑色,“白”则意
味着保留原图。
用一种看图软件浏览上述两个图,看是否达到了目标。
解:调用meshgrid函数,生成两个和测试图像大小相同的矩阵X,Y,其元素分别为相应位置的横纵坐标。以这两个矩阵为基础生成与测试图像大小相同的、分别表示(a)中的圆和(b)中的黑白格的逻辑矩阵,再以这两个矩阵与测试图像进行运算,则得到处理后的图像,如下图。
图 1 红色圆圈
图 2 黑白格
本题对应的脚本文件为exp_image1_3_2.m,涉及的资源文件为hall.mat。
第二章 图像压缩编码
本章练习题所用数据均可由“ JpegCoeff.mat ”导入。本章练习题中“测试图像”指的是hall.mat中的灰度图像。
1. 图像的预处理是将每个像素灰度值减去128,这个步骤是否可以在变换域进行?请在测试图
像中截取一块验证你的结论。
解:可以在变换域进行。由DCT的定义,在空域将每个像素灰度值减去128,相应地需要将DCT系数矩阵中的直流分量,即左上角第一个元素减去
C1,111N1N1128N128 NNx0y0 本题中选取一块8×8的区域进行验证,取N=8,验证结果如下。其中,上面的矩阵是
将测试区域在空域中将每个像素值减去128后进行DCT所得,下面的矩阵是将测试区域进行DCT后再进行上述处理所得,可见,二者完全一致。
图 3 空域和DCT域预处理结果比较
本题对应的脚本文件为exp_image2_4_1.m,涉及的资源文件为hall.mat。
2. 请编程实现二维DCT,并和MATLAB自带的库函数dct2比较是否一致。
解:通过构造DCT的算子矩阵,本题实现了自定义的二维DCT函数dct_sd()。注意,该函数对应于通用的DCT,可以处理任意长宽比的矩阵,与讲义中略有不同。选取的测试区域同上题,将该函数的运算结果与MATLAB自带的库函数dct2进行比较,结果一致,如下图。
图 4 自定义DCT与MATLAB函数dct2结果比较
本题对应的脚本文件为exp_image2_4_2.m,涉及的资源文件为hall.mat。
3. 如果将DCT系数矩阵中右侧4列全部置零,逆变换后的图像会发生什么变化?选取一块图验
证你的结论。如果左侧的4列置零呢?
解:将DCT系数矩阵中右侧4列全部置零,则相当于去除了图像中在水平方向上变化的高频成分;而将DCT系数矩阵中左侧4列全部置零,则相当于去除了图像中在水平方向和竖直方向上变化的低频成分,而且是去掉了图像中的主要频率成分。验证结果如下。
图 5 将DCT系数矩阵部分置零所得结果
其中最左侧为原始图像,中间为DCT系数矩阵中右侧4列全部置零后逆变换的图像,水平方向上的高频成分减少了。右侧为DCT系数矩阵中左侧4列全部置零后逆变换的图像,由于去除了主要频率成分,DCT系数矩阵中大部分元素都等于0或接近0,故逆变换后的图像基本是黑色的,但可以看出高频成分还是有所保留。 本题对应的脚本文件为exp_image2_4_3.m,涉及的资源文件为hall.mat。 4. 若对DCT 系数分别做转置、旋转90 度和旋转180 度操作(rot90) ,逆变换后恢复的图像有
何变化?选取一块图验证你的结论。
解:对DCT系数进行转置操作,相当于把水平方向上的频率分量与竖直方向上的频率分量进行了对换,其逆变换的结果就是对原图进行了转置。 一般的图像中低频成分相对较多,表现在DCT系数矩阵中是左上部分的系数绝对值较大而右下部分的较小。将DCT系数矩阵旋转90度后,DCT系数矩阵中左下部分的系数绝对值较大,导致其逆变换图像产生了一些在竖直方向上高频而水平方向上相对低频的成分。而将DCT系数矩阵旋转180度后,DCT系数矩阵中右下部分的系数绝对值较大,导致其逆变换图像产生了一些在竖直方向上高频且水平方向上亦为高频的成分。验证结果如下图。
图 6 转置,旋转DCT系数矩阵所得结果
其中左上图为原始图像,右上图为DCT系数转置后逆变换的图像,左下图为DCT系数
矩阵旋转90度后逆变换的图像,右下图为DCT系数矩阵旋转180度后逆变换的图像,可见与以上分析相符。
本题对应的脚本文件为exp_image2_4_4.m,涉及的资源文件为hall.mat。 5. 如果认为差分编码是一个系统,请绘出这个系统的频率响应,说明它是一个_____(低通、
高通、带通、带阻)滤波器。DC 系数先进行差分编码再进行熵编码,说明DC 系数的_____频率分量更多。
解:系统的差分方程近似为
y(n)x(n)x(n1)
其频率响应为
图 7 差分系统频率响应
可见这一系统是一个高通滤波器。DC系数先进行差分编码再进行熵编码,说明DC系数中低频成分较多,通过高通滤波器后滤除低频成分,可以使熵编码结果得到简化。
本题对应的脚本文件为exp_image2_4_5.m。 6. DC 预测误差的取值和Category 值有何关系?如何利用预测误差计算出其Category ? 解:DC 预测误差的取值和Category 值的关系可以表示为
clog2(2e1)
其中c为category,e为预测误差。
7. 你知道哪些实现Zig-Zag 扫描的方法?请利用MATLAB 的强大功能设计一种最佳方法。 解:Zig-Zag 扫描可以概括为将一个nn的矩阵中个n位置的横纵坐标与1,2,3,„„n这样一个序列构成一个映射,用MATLAB可以实现这一过程的方法有:
(a) 使用一个二重循环实现。但这一方法比较复杂,而且代码量也较大
(b) 直接构造一个映射使的n组横纵坐标对应于1,2,3,„„n这一序列,但这样的
2222映射算法也比较复杂。
(c) 先构造一个简单的函数,使n个横纵坐标对应于n个有序的数,其顺序与
Zig-Zag扫描顺序相同,再调用MATLAB的sort函数对其排序,即可得到1,2,3,„„
22n2这样一个序列,其对应的坐标按Zig-Zag 扫描方式排列。
本次实验中采用了最后一种方法,构造了函数zigzag(n),它可以返回一个1n的序列,其中第k个元素即对应对nn的矩阵Zig-Zag扫描时得到的第k个元素的下标。
本题对应的函数文件为zigzag.m。
8. 对测试图像分块、DCT 和量化,将量化后的系数写成矩阵的形式,其中每一列为一个块的
DCT 系数Zig-Zag 扫描后形成的列矢量,第一行为各个块的DC 系数。
2解:为实现本题及后面JPEG编码的要求,首先定义了函数imgbreak()对图像进行分块以及每个像素灰度值减去128的预处理,返回一个88n的矩阵以及原始图像的高度和宽度。然后构造一个64n的矩阵matrix_quan,调用zigzag()函数生成扫描序列,依次对每个图像块做DCT并进行量化,按Zig-Zag扫描的顺序写到matrix_quan的一列中。以上处理过程也是下文JPEG编码流程中的一部分。 本题对应的脚本文件为exp_image2_4_8.m,涉及到的资源文件为hall.mat和JpegCoeff.mat。
9. 请实现本章介绍的JPEG 编码(不包括写JFIF 文件),输出为DC 系数的码流、AC 系数的
码流、图像高度和图像宽度,将这四个变量写入jpegcodes.mat 文件。
解:为实现本题要求的功能,定义了函数encode()对图像进行编码。该函数对图像的前一部分处理与第8题完全相同。在得到matrix_quan矩阵后,对其第一行(亦即图像各块的直流分量)进行差分。然后分别调用函数DCencode()和ACencode()依次对每一图像块的直流分量和交流分量进行熵编码。并将编码结果(1/0序列)追加到DCstream和ACstream后面。在对全部图像块编码完成后,返回码流和图像高度以及宽度。 DCencode根据码表DCTAB进行编码,首先将输入值n按照第6题中的方法确定其category,在对应的编码后接上n的1补码。 ACencode根据码表ACTAB进行编码,其输入是matrix_quan中每一列后63个交流分量所构成的列向量ACcoeff。首先找到ACcoeff中最后一个非零值的位置,对其之前的序列进行编码。以变量run记录当前元素到上一个非零元素之间0的个数,遇到每个非零元素时加1。当遇到非零元素时,采用第6题的方法确定该元素对应的size,根据run/size确定前一段Huffman编码,在将非零元素的1补码接到这一编码之后。最后在编码的末尾接入EOB标志的编码。 本题对应的脚本文件为exp_image2_4_9.m,涉及到的自定义函数文件为encode.m,imgbreak.m,zigzag.m,DCencode.m,ACencode.m,涉及到的资源文件为hall.mat和JpegCoeff.mat。
10. 计算压缩比(输入文件长度/输出码流长度),注意转换为相同进制。
解:通过workspace窗口可以看到hall_gray是一组120×168的uint8型数据,转换为二进制为161280位。而载入保存在jpegcodes.mat中的编码结果,DC编码为2031位,AC编码为23074位,高度和宽度分别用一个uint8型变量表示,故压缩比约为
1612806.42
2031230748811. 请实现本章介绍的JPEG 解码,输入是你生成的jpegcodes.mat 文件。分别用客观(PSNR) 和
主观方式评价编解码效果如何。
解:为实现本题要求的功能,定义了函数decode()对码流进行了解码。该函数分别调用函数DCdecode()和ACdecode()对DC码流和AC码流进行解码,随后对DC系数进行逆差分处理,得到系数矩阵matrix_quan。对matrix_quan中的每一列,通过Zig-Zag扫描和IDCT还原出一个8×8图像块。最后根据输入的图像高度和宽度信息,将所有图像块拼接起来并还原到原图像的大小。 DCdecode()函数根据码表DCTAB进行Huffman解码。该函数从码流中的当前位置依次向后读取每一位,直到能确定一个category对应的Huffman编码,然后从这一Huffman编码后读取相应长度的码位转换为十进制的DC系数,再从下一位开始重复以上过程,直到完成解码或发现码流出错。 ACdecode()函数根据补充了EOB和ZRL的码表ACTAB_app进行Huffman解码。该函数从码流中的当前位置依次向后读取每一位,直到能确定一个run/size对应的Huffman编码,然后从这一Huffman编码后读取相应长度的码位转换为十进制的AC系数,并在前面接上run个0。每遇到一个EOB标志则表示开始进行下一个图像块的解码。重复以上过程直到完成解码或发现码流出错。 解码结果如下,
图 8 JPEG编解码效果
其中左侧为原始图像,右侧为经过编码和解码后的图像。可见二者基本一致,但解码后的图像在物体的轮廓边缘处略有模糊,这是由于编码过程中高频分量丢失造成的。此外,在放大的图像上可以看出解码后的图像中有分块的痕迹。
用客观方式评价解码效果:PSNR71.8117。
本题对应的脚本文件为exp_image2_4_11.m,涉及到的自定义函数文件为decode.m,imgmerge.m,zigzag.m,DCdecode.m,ACdecode.m,涉及到的资源文件为hall.mat, JpegCoeff.mat和jpegcodes.mat。
12. 将量化步长减小为原来的一半,重做编解码。同标准量化步长的情况比较压缩比和图像质
量。
解:将量化矩阵QTAB的值减小为原来的一半做为参数输入到encode()和decode()函数中,将所得图像与原始量化步长的编解码效果进行对比,如下图。
图 9 减小量化步长的编解码效果
其中最左侧为原始图像,中间为原始量化步长的编解码结果,右侧为减半的量化步长编解码的结果。在放大的图像上可以看出,减半的量化步长产生了与原始图像更接近的解码结果,物体轮廓边缘的模糊得到了改善。而采用客观方式评价,减半的量化步长编解码的图像PSNR78.7641,优于原始量化步长的结果。 本题对应的脚本文件为exp_image2_4_12.m,涉及到的自定义函数文件为encode.m,imgbreak.m,DCencode.m,ACencode.m,decode.m,imgmerge.m,zigzag.m,DCdecode.m,ACdecode.m,涉及到的资源文件为hall.mat, JpegCoeff.mat。
13. 看电视时偶尔能看到美丽的雪花图像(见snow.mat ),请对其编解码。和测试图像的压
缩比和图像质量进行比较,并解释比较结果。
解:对雪花图像进行编解码,所得结果如下。
图 10 雪花图像编解码效果
其中左侧是原始图像,右侧是编解码后得到的图像。 snow是一组128×160的uint8型数据,转换为二进制为163840位。而DC编码为1403位,AC编码为43538位,高度和宽度分别用一个uint8型变量表示,故压缩比约为
而且编解码的效果也没有测试图像理想。这是因为雪花图像中含有大量的高频分量,在编码时AC系数普遍较大,编码较长。而且高频分量的量化误差也更大。因此编解码在压缩比和图像效果上都没有测试图像理想。
本题对应的脚本文件为exp_image2_4_13.m,涉及到的自定义函数文件为decode.m,imgmerge.m,zigzag.m,DCdecode.m,ACdecode.m,涉及到的资源文件snow.mat,
1638403.64
14034353888PSNR52.7855。用客观方式评价解码效果:可见雪花图像的压缩比要小于测试图像,
JpegCoeff.mat。
第三章 信息隐藏
1. 实现本章介绍的空域隐藏方法和提取方法。验证其抗JPEG 编码能力。
解:为了将信息转化为二进制码,首先设计了一套编码体系,将小写英文字母、空格以及信息结束标志符编为Huffman码,并设计了编码函数alphaencode()和解码函数alphadecode()实现编解码功能。这一编码体系在本章的所有习题中是通用的。 在构造Huffman码表时,根据一份比较准确的英文字母使用频率表,调用了MATLAB函数huffmandict()生成Huffman码表。编码函数alphaencode()直接调用了MATLAB函数huffmanenco()。而解码时由于一个图像中不一定所有的像素都存有编码信息,需要通过结束位来判断码流结束,故解码函数alphadecode()并未直接使用MATLAB函数huffmandeco(),而是参照了第二章中DC系数和AC系数的解码函数进行了设计。 为了实现本题中的空域隐藏方法,分别设计了函数concealspc()和revealspc()用于隐藏信息和提取信息。函数concealspc()调用函数alphaencode()将信息转换为二进制码,通过改变每个像素灰度值的奇偶性将信息的二进制码嵌入到每个像素比特的最后一位上,实现信息的隐藏。函数revealspc()首先提取出每个像素比特的最后一位,然后调用函数alphadecode()进行解码。 本题的信息隐藏和提取结果如下,
图 11 空域嵌密效果
其中左侧为原始图像,右侧为嵌密后的图像,可见二者差异极不明显。隐藏信息为:
“living in the past is a luxury none of us can afford we must learn from it but we cannot live there it is impossible to plan for the now the present is ever fleeting the future is where we must live the future is what we must plan for” revealspc()函数成功实现了提取信息。而经过JPEG编解码后该信息完全丢失,尝试提取信息时得到的结果为:
“sann nui sstutnneto ct rtl otrthyfnrogmi g
etekeytomeeeutnaahvhbchsi acoleoobdeeeeeftdntaxmcaosstt otsmteaaoanieuureceeeafundi teretweeitenn
noenrevrtetenseaurhoboattiehhonenroceryaitotetvicyttptethdaeuaahpu rttrliewurhtcobnlnnkttffyir…”
可见空域嵌密方法不适用于需进行JPEG编解码的场合。
本题对应的脚本文件为exp_image3_4_1.m,涉及到的自定义函数文件为concealspc.m,revealspc.m,alphaencode.m,alphareveal.m,decode.m,DCdecode.m,ACdecode.m,
imgmerge.m,zigzag.m,涉及到的资源文件为hall.mat,JpegCoeff.mat ,AlphabetCoeff.mat。 2. 依次实现本章介绍的三种变换域信息隐藏方法和提取方法,分析嵌密方法的隐蔽性以及嵌密
后JPEG图像的质量变化和压缩比变化。 解:为实现本章介绍的三种DCT域信息隐藏和提取方法,分别设计了三对函数:concealdct()/revealdct(),concealdct_part()/revealdct_part(),concealdct_app()/revealdct_app(),这三组函数都是在第二章中的JPEG编解码函数encode()/decode()基础上设计的,他们在保留了相应的JPEG编解码功能的同时,增加了将信息隐藏到码流中和从码流中提取信息的功能。 concealdct()函数按顺序(图像块行优先,每个图像块的DCT系数矩阵Zig-Zag扫描顺序)将信息隐藏到图像块的每个DCT系数中,revealdct()函数则按顺序从DCT系数中提取。隐藏信息和提取信息的方法同本章第1题中的空域方法完全相同。虽然这种隐藏和提取方法容量较大,但由于在图像中加入了大量的高频成分,隐藏效果十分不理想,在图像的某些分块上产生了大量的噪点。同时,由于AC系数中的非零元素大大减少,故编码结果也不可避免地产生了延长,导致压缩比降低。本方法的压缩比为
1612806.36
20312332288嵌密图像效果如下。
图 12 在全部DCT系数中嵌密效果
concealdct_part()函数将信息隐藏在每个分块的DC分量中,而revealdct_part()则从每个分块的DC系数中提取信息。提取和隐藏信息的方法同本章第1题中的空域方法亦完全相同。这种隐藏方式导致信息容量大大减小,但由于DC分量绝对值普遍较大,改变其最低位一般对图像质量影响不大,故这种隐藏方式相对比较隐蔽。同时DC系数的编码也不会明显延长,故对压缩比的影响较小。本方法的压缩比为
1612806.42
20382307488嵌密图像效果如下。
图 13 在部分DCT系数中嵌密效果
concealdct_app()函数将信息0/1序列改为-1/1序列,隐藏在每个分块的DCT系数按Zig-Zag顺需排列的最后一个非零元素之后,而revealdct_app()则从相应位置提取信息。这种隐藏方式同样导致信息容量减小。这一方法虽然会向原始图像中增加高频分量,但由于高频分量是追加在最后一个非零分量后,故对图像的影响相对不明显。而AC编码也会不可避免地增加一项,故压缩比会有一定的减小。本方法的压缩比为
1612806.29
20312357588 嵌密图像效果如下。可见部分图像块中还是产生了比较明显的水平方向或竖直方向上的高频分量。
图 14 在每个分块最后一个非零DCT系数后嵌密效果
本题对应的脚本文件为exp_image3_4_2.m,涉及到的自定义函数文件为concealdct.m,revealdct.m,concealdct_part.m,revealdct_part.m,concealdct_app.m,revealdct_app.m,alphaencode.m,alphareveal.m,imgbreak.m,DCencode.m,ACencode.m,imgmerge.m, DCdecode.m,ACdecode.m,zigzag.m,涉及到的资源文件为hall.mat,JpegCoeff.mat ,AlphabetCoeff.mat。
3. (选做)请设计实现新的隐藏算法并分析其优缺点。
第四章 人脸检测
1. 所给资料Faces 目录下包含从网图中截取的31 张人脸,试以其作为样本训练人脸标准v 。
(a) 样本人脸大小不一,是否需要首先将图像调整为相同大小? (b) 假设L 分别取3; 4; 5 ,所得三个v 之间有何关系?
解:为提取人脸检测的标准,设计了函数chromdstr(),按给定的L值返回一副图像的颜色分布u。其中首先将RGB的每一个分量从2中颜色映射到2中颜色上,然后再将三元组(R,G,B)映射到整数区间1,23L8L1上去。统计所有像素的颜色,即可得到颜色在整数区间上的分布
u。对全部31张人脸的分布取平均即为人脸标准v。 样本人脸大小不一,但由于颜色分布与大小无关,故不需要将图像调整为相同大小。 取L分别为3,4,5,所得的三个v如下。
图 15 L=3时的颜色分布标准
图 16 L=4时的颜色分布标准
图 17 L=5时的颜色分布标准
可见L值越小,颜色分布相对越集中。 本题对应的脚本文件为exp_image4_3_1.m,涉及到的自定义函数文件为chromdstr.m,涉及到的资源文件为FacialCoeff.mat。
2. 设计一种从任意大小的图片中检测任意多张人脸的算法并编程实现(输出图像在判定为人脸
的位置加上红色的方框)。随意选取一张多人照片(比如支部活动或者足球比赛),对程序进行测试。尝试L 分别取不同的值,评价检测结果有何区别。
解:为实现人脸检测的算法,本题设计了函数detectface(),其算法设计如下。
(1) 按照一定的标准(绿色分量和蓝色分量相对于红色分量的比值、亮度)从颜色范
围上简单确定可能是脸部的区域。并调用MATLAB函数imclose(),将相邻较近的区域连起来。 (2) 考察图像中每个大小为12×12相邻水平或竖直方向上间隔为6的区域(故彼此有
重叠)。如果其中有超过80%的像素点都可能是脸部颜色,则考察这一区域中的颜色分布并与标准v进行对比,如果二者的距离(定义见讲义)小于某给定阈值,则判定这一区域为脸的一部分。再次调用MATLAB函数imclose(),将相邻较近的区域连起来。 (3) 标定所有脸部区域,从中确定图像中最大的脸部区域的高度和宽度,对于所有高
度或宽度小于最大值1/4的脸部区域予以排除。 (4) 在其余的脸部区域上打上红色方框。 对于该算法有以下说明: (1) 从颜色上来确定可能的脸部区域比较简便,但是选取可能的颜色范围是比较复杂
的。本题选取的是由(绿色分量对红色分量的比值,蓝色分量对红色分量的比值,亮度)这样一个三维的矩形空间。之所以不直接使用(R,G,B)三维空间,是因为人眼对颜色的判断导致人脸颜色的大致范围在(R,G,B)三维空间中形状是比较复杂的。至于选取哪一种色彩空间最合适,本题中也只是作了一个大概的尝试,其判断效果比较理想。
此外,关于颜色范围的边界值的选取。最初的思路是在训练人脸颜色分布标准的同时获得。但实际测试时发现所得结果并不理想,因此在分析了一些带有背景的
照片并参考前述自动获得的边界值后,以主观的方式调整了这一组边界值,得到了较好的效果。 (2) 考察图像中每个12×12的区域,这是由于人脸的颜色大部分是皮肤的颜色,即使
是脸上一小部分的区域,其颜色分布与全脸的颜色分布(包括眼睛嘴唇)也是比较接近的。同时,这样的分区方法也直接导致该算法不能找到图像中较小的人脸。 (3) 忽略所有高度或宽度小于最大值1/4的脸部区域,这一步骤符合人类的心理特征,
在观察照片中的人脸时倾向于发现最大最显著的面部区域。这一步骤还可以排除照片中一些较小的肤色区域可能带来的干扰(比如手)。
下面是本函数对一些图像的检测结果。这些照片的背景与脸色普遍差距较大,有利于检测人脸。除了为适应MATLAB的imread()函数外,所有照片没有进行刻意的大小调整。
图 18 人脸检测测试图像1
图 19 人脸检测测试图像2
图 20人脸检测测试图像3
图 21 人脸检测测试图像4
图 22 人脸检测测试图像5
图 23 人脸检测测试图像6
图 24 人脸检测测试图像7
最后这张照片反映了本算法的一些局限性。首先,照片左下角的一些人脸没有被检测到或是只有部分被检测到。经过对detectface()函数进行调试,发现这一部分人脸主要是由于与训练所得标准偏差过大而被排除的。但如果将判定的阈值调低,又会造成其他一些照片中人脸与背景混淆。这就需要在选取阈值时进行一下平衡,并尝试寻找更好的标准。同时,照片中相距较近的两张人脸会被误判为一整张人脸,这主要是由于在选取区域时采用了12×12的较大规格并在调用imclose()函数时进行了扩散操作,导致本该分开的两块区域连在了一起。但这样的操作对于检测其他一些图像又是必须的。总之,单纯依靠颜色特征的算法检测人脸还是有较大的局限性的。
以上的检测是基于L=3的标准进行的。将L改为4和5后采用同样的阈值时,发现产生了更多的漏检,如下图。
图 25 L=4时的检测结果1
图 26 L=5时的检测结果1
图 27 L=4时的检测结果2
图 28 L=5时的检测结果2
为达到相同的检测效果,需要相应地提高阈值,但这样又会导致对背景颜色的分辨能力的下降。
本题对应的脚本文件为exp_image4_3_2.m,涉及到的自定义函数文件为detectface.m,chromdstr.m,measure.m涉及到的资源文件为FacialCoeff.mat。
3. 对上述图像分别进行如下处理后
(a) 顺时针旋转90度 (imrotate);
(b) 保持高度不变,宽度拉伸为原来的2 倍(imresize) ; (c) 适当改变颜色(imadjust) ;
解:由于在detectface()函数中对人脸的长宽比作了一定的假设,故在旋转或拉伸时可能需要修改一些参数。不过大体上来看,对面部区域的识别仍是正确的。这也验证了通过颜色特征检测面部区域对图像形状变化的不敏感性。部分检测结果如下。
(a) 顺时针旋转90度 (imrotate);
图 29 旋转后的检测结果1
图 30 旋转后的检测结果2
(b) 保持高度不变,宽度拉伸为原来的2 倍(imresize);
图 31 拉伸后的检测结果1
图 32 拉伸后的检测结果2
不过,以颜色为标准检测人脸对颜色的改变是比较敏感的。部分检测结果如下。 (c) 适当改变颜色(imadjust);
图 33 改变颜色后的检测结果1
图 34 改变颜色后的检测结果2
图 35 改变颜色后的检测结果3
图 36 改变颜色后的检测结果4
本题对应的脚本文件为exp_image4_3_3.m,涉及到的自定义函数文件为detectface.m,chromdstr.m,measure.m涉及到的资源文件为FacialCoeff.mat。
4. 如果可以重新选择人脸样本训练标准,你觉得应该如何选取?
解:我认为还可以选取五官的相对位置作为人脸样本的训练标准。这样做的优点有:比较准确,可以有效排除其他裸露的皮肤区域;可以比较准确地确定人脸大小,便于进行模板匹配;对光照等拍摄条件非常鲁棒,等等。但同时,这一训练标准的实现也比较复杂,而且难以检测侧脸或旋转角度较大的人脸。
附:本实验中的脚本、自定义函数,资源文件以及测试图像文件目录
1. 脚本文件
(1) exp_image1_4_1.m (2) exp_image2_4_1.m (3) exp_image2_4_2.m (4) exp_image2_4_3.m (5) exp_image2_4_4.m (6) exp_image2_4_5.m (7) exp_image2_4_8.m (8) exp_image2_4_9.m (9) exp_image2_4_11.m (10) exp_image2_4_12.m (11) exp_image2_4_13.m (12) exp_image3_4_1.m (13) exp_image3_4_2.m (14) exp_image4_3_1.m (15) exp_image4_3_2.m (16) exp_image4_3_3.m
(17) gentab.m(在第三章实验中产生小写英文字母Huffman码表的脚本文件) 2. 自定义函数文件 (1) ACdecode.m (2) ACencode.m (3) alphadecode.m (4) alphaencode.m (5) chromdstr.m (6) concealdct.m
(7) concealdct_app.m (8) concealdct_part.m (9) concealspc.m (10) DCdecode.m (11) DCencode.m (12) dct2_sd.m (13) decode.m (14) detectface.m (15) encode.m (16) imgbreak.m (17) imgmerge.m (18) measure.m (19) revealdct.m
(20) revealdct_app.m (21) revealdct_part.m (22) revealspc.m
(23) zigzag.m
3. 资源文件
(1) AlphabetCoeff.mat (2) FacialCoeff.mat (3) hall.mat
(4) ImageCoeff.mat (5) jpegcodes.mat (6) JpegCoeff.mat (7) snow.mat 4. 测试图像文件 (1) chairman.jpg (2) chairmans.jpg (3) chorus.jpg
(4) happy&wolfy.jpg (5) kimjongil.jpg (6) sakochy.jpg (7) statecouncil.jpg
因篇幅问题不能全部显示,请点此查看更多更全内容