第4章 图像处理和识别
function test_mouse_track() %鼠标轨迹 clc; %清屏 figure;
I=imread('400px-Chess.jpg'); %载入图片 imshow(I); %显示图片
set(gcf,'Window Button DownFcn',@Buttton Down Fcn); % 回调函数
function Buttton Down Fcn(src,event)
pt = get(gca,'CurrentPoint'); %使pt等于当前鼠标坐标值 x = pt(1,1); %赋值 y = pt(1,2); %赋值
str = sprintf('x = %.3f, y = %.3f', x, y);%显示出x、y值 text(x, y, str);
这种方法的实时性要很好,但是缺点也是显而易见的,这个程序是不能存储数据的,用来展示还好,但是要是用来使用的话就会造成诸多不便,所以本次设计不采用这种方法。下面来看第二种方法,也是本次设计我所采用的方法。
这种方法是先把图片选出来,然后加载图片,之后就可以根据所编写的程序和所设定的点的选取数开始选取点,也就是用鼠标进行点的选取,每当鼠标点击一下,程序就自动存储下一个点的信息,当鼠标点的次数够之前的设定次数时,这个小程序也就结束了,同时在matlab的工作区域显示出相应的x值和y值。
这个程序的实现并不是很困难,只有几条语句,其程序如下: figure; %限制显示一张图片框 imshow('liftingbody.png'); %显示图片 [x,y]=ginput(5); %取5个点
第一句是现实语句,是一个初始化的过程,第二句时把目标的图片显示出来,第三句中的“5”是设定要选取多少个点,也就是鼠标点击多少下,第四句是显示当点的鼠标的所在点的灰度和三色素质。
当然,现在我要处理的训练图片使比较多的,要是想同时处理好几个也是可以实现的,但是这时候就要进行程序语句的更改了:
figure;
30
第4章 图像处理和识别
subplot(1,2,1), imshow('liftingbody.png'); subplot(1,2,2), imshow('autumn.tif'); [x,y]=ginput(5); impixelinfo;
这时,在显示器上将同时显示两幅图片,就实现了同时处理多幅图片的愿望,但是这时候设置的采样点的个数也要相应的变化才行。
(3)权值t的确定
由前面分析,确定阈值对权值的确定是十分有益的。所以此处着重讨论阈值的确定。先熟悉两个概念,也就是膨胀和腐蚀。
膨胀和腐蚀是数学形态中的最基本的运算,对图像的提取和识别比较重要。膨胀是对图像中的目标对象增加像素,而腐蚀则是对图像中的目标对象去除像素,它们是对偶运算。增加或去除像素的多少取决于图像处理中结构元素的大小和形状。在形态学的膨胀和腐蚀运算中,输出的图像的任何一个像素都遵循一定的规则,这种规则决定了形态运算是膨胀还是腐蚀,这个规则是这样的,若是膨胀的话,输出图像的像素值是输入图像邻域中的追大致,在一个二值图像中,只要是一个像素值为1,则相应的输出像素值为1;而腐蚀则恰恰相反,输出图像的像素值是输入图像邻域中的最小值,在一个二值图像中,只要有一个像素值为0,则相应的输出像素值为0。二值图像的形态学膨胀运算在感兴趣的区域有结构元素的定义中有一个元素为1,根据形态学膨胀运算规则,则相应的输出像素为1,灰度图像的形态学膨胀运算在感兴趣的位置上的像素值为有结构元素定义的邻域的最大值16。在上述形态学运算中,结构元素的中心元素在输入图像的感兴趣区域内。而且对图像的边缘像素,由结构元素定义的部分邻域就有可能超出图像的边界。为定义边界像素,形态学函数为这些未定义的边界指定一个像素值,相当于为整个图像增加了另外的行和列,这个过程称为边界填充,下面是一些边界填充规则:膨胀的话超出边界的部分致电该为图像的数据类型的最小值,对二值图像而言,边界像素值为0,对灰度图像,若数据类型为uint8,则边界像素值为0,腐蚀的话超出边界的部分指定为像素的数据类型的最大值,对二值图像而言,边界像素值为1,对灰度图像,若数据类型为uint8,则边界像素
31
第4章 图像处理和识别
值为255。开启何必和是形态学中的两个重要运算,它们是由膨胀和腐蚀组合而成的复合运算。开启运算通常可以期考平滑图像轮廓的作用,去除轮廓上的毛刺,也就是想办法把图像中不尽如人意的小细节处理一下,从而使其更具有可处理性,跟滤波有异曲同工之处,其实也是另一种形式的滤波,截断狭窄的山谷,也就是去除不必要的粘连,使图像的清晰度和区分度提高,而闭合运算虽然也是对于图像轮廓的平滑作用,但是结果相反,它是能去除区域中的小孔,也就是对能进行填充,把不足之处进行补足,这也是相对于开启的另一种运算,和去除毛刺相对,填平狭窄的断裂、细长的沟壑,也就是将原本不相连的两个部分进行相连,从而提高图像的清晰度和区分度,还可以将轮廓的缺口进行填充。先腐蚀再膨胀称为开启运算,先膨胀再腐蚀称为闭合运算称为闭合运算,所以实现开启跟闭合运算就是实现了膨胀与腐蚀的复合运算。
下面是开启运算的示例程序:
I=inread(?face.png?); %读入待处理的图像; imshow(I); %显示图片; se=strel(?disk?,5); %生成圆形结构图; I_opened=imopen(I,se); %执行开启运算; figure,imshow(I_opened); %开启运算后的图像; 下面是闭合运算的示例程序:
I=imread(?face.png?); %读入待处理的图像; imshow(I); %显示图片; Se=strel(?disk?,10); %生成圆形结构元素; closeBW=imclose(I,se); %执行闭合运算; figure,imshow(closeBW); %显示闭合运算后的图像;
(4)灰度值i的获得
由于所需是灰度值,当所处理的图片是彩色图像,也就是三色图时,要注意用matlab语句转化成灰度图才能处理,另外要注意统一训练图片的分辨率推荐值是750*500,因为经过我试验在这个分辨率值可以得到比较理想的识别效果。
32
第4章 图像处理和识别
4.5 选点策略
在此次设计中,我共选择了107个点,其中44个权值为0的点(高权值),还有53个权值为2的点(低权值),具体分布见下面的图4-3,其中黑点为高权值点,白点为低权值点。
图4-3 人脸选点示意图
当做好选点工作,将其数据与相应的图片设为同名并放在指定文件夹里时,程序运行时该图片就能被识别,识别结果见下图4-4。
图4-4 被识别的人脸图
4.6 程序流程图
从模块的角度说,主程序主要是由训练模块和定位模块组成。训练模块首先进行灰度化处理图像预处理,然后获取人脸形状和纹理信息,经对其和PCA建模后形成统计模型。定位模块进行图形处理后,对其进行匹配和修正调整,直至收敛为止。
33
第4章 图像处理和识别
原始图像开始练集中每幅图灰度化、图像预处理灰度化、图像预处理训练模块对当前图像进行匹配获取人脸形状及纹理信息定位模块根据统计模型进行调整形状对齐、用PCA方法建立统计形状模型收敛?是否结束 ASM统计模型目标形状 图4-5 程序流程图
4.7 收敛过程和识别结果
图4-6 收敛过程示意图
34