图像识别技术报告.docx
《图像识别技术报告.docx》由会员分享,可在线阅读,更多相关《图像识别技术报告.docx(29页珍藏版)》请在冰豆网上搜索。
图像识别技术报告
图像识别技术
课程教师:
桑爱军老师
报告组成员:
五里雾
一、图像识别简介
图像识别是指图形刺激作用于感觉器官,人们辨认出它是经验过的某一图形的过程,也叫图像再认。
在图像识别中,既要有当时进入感官的信息,也要有记忆中存储的信息。
只有通过存储的信息与当前的信息进行比较的加工过程,才能实现对图像的再认。
人的图像识别能力是很强的。
图像距离的改变或图像在感觉器官上作用位置的改变,都会造成图像在视网膜上的大小和形状的改变。
即使在这种情况下,人们仍然可以认出他们过去知觉过的图像。
甚至图像识别可以不受感觉通道的限制。
例如,人可以用眼看字,当别人在他背上写字时,他也可认出这个字来。
图像识别技术可能是以图像的主要特征为基础的。
每个图像都有它的特征,如字母A有个尖,P有个圈、而Y的中心有个锐角等。
对图像识别时眼动的研究表明,视线总是集中在图像的主要特征上,也就是集中在图像轮廓曲度最大或轮廓方向突然改变的地方,这些地方的信息量最大。
而且眼睛的扫描路线也总是依次从一个特征转到另一个特征上。
由此可见,在图像识别过程中,知觉机制必须排除输入的多余信息,抽出关键的信息。
同时,在大脑里必定有一个负责整合信息的机制,它能把分阶段获得的信息整理成一个完整的知觉映象。
在人类图像识别系统中,对复杂图像的识别往往要通过不同层次的信息加工才能实现。
对于熟悉的图形,由于掌握了它的主要特征,就会把它当作一个单元来识别,而不再注意它的细节了。
这种由孤立的单元材料组成的整体单位叫做组块,每一个组块是同时被感知的。
在文字材料的识别中,人们不仅可以把一个汉字的笔划或偏旁等单元组成一个组块,而且能把经常在一起出现的字或词组成组块单位来加以识别。
图像识别技术是人工智能的一个重要领域。
为了编制模拟人类图像识别活动的计算机程序,人们提出了不同的图像识别模型。
例如模板匹配模型。
这种模型认为,识别某个图像,必须在过去的经验中有这个图像的记忆模式,又叫模板。
当前的刺激如果能与大脑中的模板相匹配,这个图像也就被识别了。
例如有一个字母A,如果在脑中有个A模板,字母A的大小、方位、形状都与这个A模板完全一致,字母A就被识别了。
这个模型简单明了,也容易得到实际应用。
但这种模型强调图像必须与脑中的模板完全符合才能加以识别,而事实上人不仅能识别与脑中的模板完全一致的图像,也能识别与模板不完全一致的图像。
例如,人们不仅能识别某一个具体的字母A,也能识别印刷体的、手写体的、方向不正、大小不同的各种字母A。
同时,人能识别的图像是大量的,如果所识别的每一个图像在脑中都有一个相应的模板,也是不可能的。
为了解决模板匹配模型存在的问题,格式塔心理学家又提出了一个原型匹配模型。
这种模型认为,在长时记忆中存储的并不是所要识别的无数个模板,而是图像的某些“相似性”。
从图像中抽象出来的“相似性”就可作为原型,拿它来检验所要识别的图像。
如果能找到一个相似的原型,这个图像也就被识别了。
这种模型从神经上和记忆探寻的过程上来看,都比模板匹配模型更适宜,而且还能说明对一些不规则的,但某些方面与原型相似的图像的识别。
但是,这种模型没有说明人是怎样对相似的刺激进行辨别和加工的,它也难以在计算机程序中得到实现。
因此又有人提出了一个更复杂的模型,即“泛魔”识别模型。
二、具体应用实例
基于方向梯度极值的手形轮廓跟踪算法
摘要
针对受自然光照影响的手形图像难以准确提取手形轮廓的问题,本文基于手形边界像素在垂直于边界方向上存在灰度突变的特性,提出了一种基于方向梯度极值的手形轮廓跟踪算法。
该算法首先找到手形轮廓的起始点,然后按照一定的搜索方向和规则,在局部区域内计算候选点集中梯度极大值所在的点,并逐点跟踪极大值点,得到手形轮廓。
将该方法在实验室自采图库及香港科技大学(HKUST)的手形图像库两个数据库中进行轮廓跟踪实验,结果显示,自采图库的跟踪准确率为100%,香港科技大学手形图像库的跟踪准确率为85.8%,该库中符合本文算法限制条件的图像的跟踪准确率为99.4%。
实验结果表明,该方法能在灰度图像上直接跟踪出准确、连续、完整的手形轮廓,尤其适合于受光照不均影响的手形图像的边缘提取。
1引言
在生物特征识别领域,手形识别以其采集方便、处理速度快、对设备要求不高、易与其它特征组合成多生物特征识别等优点而备受关注和重视,已成为一种极具发展潜力的生物特征识别技术。
手形识别是指对手部的外部轮廓所构成的几何图形进行识别,提取的特征为手的不同部位的尺寸或是手指边缘的轮廓点集。
因此手形轮廓提取的准确程度对整个手形识别过程至关重要,直接决定了提取特征的准确性。
采用现有的手形提取方法获取完整准确的手形轮廓图形时,对采集设备的遮光和光线要求比较严格,采集的大多是前景和背景灰度差异十分明显的不受光照影响的手形图像,通过阈值二值化和图像滤波来获得较好的分割效果。
但这些手形提取方法都局限于各自的图像条件,适用范围局限性大。
在实际应用中往往不便于在采集图像时加入过多的限制条件,一是限制条件过多会使用户觉得不友好,甚至产生抵触情绪;二是这大大减小了手形识别/认证的适用范围,制约其发展。
考虑到友好性、实用性和价格等因素,手形识别应尽量选用普通低成本设备,并尽量减少手形采集时的限制条件,但这就使得实际应用环境中采集的图像会不同程度地受到光照环境和采集设备的影响。
如偏光导致的高光和阴影以及随着照明光源的位置变化,极易在提取过程中造成手形轮廓的缺失和冗余,而设备噪声也会给手形轮廓的提取造成很大的误差。
因此,在这些图像条件下,原有的手形提取方法不再适用,需要寻找与之相适应的新的手形提取方法,以确保提取的特征受外界环境的干扰尽可能小。
针对实际环境中自然光照条件下拍摄的图像易受光照影响,而原有方法难以准确提取轮廓的问题,本文提出了一种基于方向梯度极值的手形轮廓跟踪算法,在灰度图像上直接跟踪手形轮廓。
该方法利用手形边界像素在垂直于边界方向上存在灰度突变的特性,从手形轮廓起始点开始,通过计算局部区域内的候选点中梯度极大值所在的点,并逐点跟踪极大值点得到手形轮廓。
分别应用该算法对实验室自采的手形图像库和香港科技大学提供的手形图像库进行实验,结果表明了该算法的有效性。
2本文轮廓跟踪方法
在手形灰度图像中,位于手形边界轮廓处的像素,在垂直于边界方向上存在灰度级的迅速变化,且真实边界点在垂直于边界方向上的灰度梯度应为局部区域内各像素梯度的极大值,因此可以通过判断局部区域内各点灰度梯度的大小找到手形的真实边缘点。
本文方法首先定位手形轮廓的起始点,然后依据手形轮廓的走向在局部区域内确定出候选的轮廓点集,用合适的梯度卷积模板计算出候选像素点集中垂直于边缘方向上梯度最大的点(此处的边缘方向是指:
从上一轮廓点到该候选点的方向),并逐点跟踪梯度最大点,既可得到完整的手形轮廓。
通过对大量图像的观察,发现位于手形边缘处存在3~4个像素宽度的灰度过渡变化带,如图1所示。
由于该过渡带的存在,手形边界处的像素并非在单像素宽度内呈现梯度的急剧变化,因此用简单的微分算子难以找到真实边缘。
算法关键是:
(1)找到合适的梯度卷积模板;
(2)在手形边界的过渡带像素中确定出真实边界点的准则。
若选取的梯度卷积模板过小,则受过渡带像素的影响大,易出现梯度极大值所在的点偏离手形轮廓的情况;而模板过大不仅会导致算法计算量大,而且对于手指间缝隙较小的图像,在跟踪至指跟处时,由于轮廓像素的方向变化较快,过大的模板窗口在此处卷积后的值表征垂直于轮廓方向梯度的能力减小,影响跟踪的准确性。
因此梯度卷积模板的选取至关重要。
本文通过用不同大小、不同方向的模板对大量图像进行实验验证得出:
本文选用的5X5大小的4个方向的梯度卷积模板计算手形边缘像素的灰度梯度效果最优。
本文均以手腕部位在图像右侧的右手图像为例阐述该算法,如图2。
2.1轮廓跟踪算法描述
2.1.1确定轮廓跟踪起始点
本文算法设定轮廓跟踪起始点为图像最右列的手腕上边缘点。
位于手腕边缘处的像素点,灰度级存在明显变化,且真实边缘点处应有最大的灰度变化。
微分边缘检测算子在图像灰度级迅速变化的点处得到较高的值,且灰度级变化越大,该点所得的值越大。
因此本文用一个竖直方向的边缘检测模板(模板1),逐点与图像最右列像素做卷积,卷积所得的值即为图像中与模板中心元素对应的像素点在竖直方向上的梯度,梯度值最大且为正值的点即为手形轮廓起始点。
若在定位轮廓起始点时,出现两个梯度值最大且为正值的点的情况,则增大梯度模板,将模板上下各增加一个元素,用新模板对这两个梯度值最大且为正值的点重新求取梯度值,若两点的梯度值仍相等,则继续增大模板,直至找到唯一的轮廓起始点。
若出现两个以上梯度值相同的点,可用同样方法处理。
2.1.2确定第二、第三轮廓点及轮廓走向
依据起始点位置,确定第二、第三轮廓点。
本文轮廓跟踪顺序为:
从起始点开始,沿逆时针方向,按照手形轮廓的自然走向逐点跟踪,直至跟踪到达图像右侧边缘,结束跟踪。
因此第二轮廓点的候选点集为起始点(i,j)左侧的3个邻域像素点,如图3所示,3个候选点为(i-1,j-1),(i,j-1),(i+1,j-1)。
由于此时候选像素点位于图像边界,若采用本文的5X5模板进行卷积,位于图像边缘处的像素不够容纳模板窗口的大小,因此不适宜用本文5X5模板求取梯度的方法确定
第二轮廓点。
故对第二轮廓点采用了如下求取方法:
(1)依据公式
(1)求得最大值MAX。
(2)当公式
(1)取得最大值MAX时,对应的像素点坐标(i+k,j-1)为第二轮廓点。
MAX=max{abs[h(i+k,j-1)-h(i+k-1,j-1)]}k=-1,0,1
(1)
其中:
h(p,q)为图像中第p行,第q列像素点的灰度值。
第二轮廓点确定后,依据第二轮廓点位置,用相同方法确定第三轮廓点,并将第三轮廓点作为当前点,将第二轮廓点到第三轮廓点的方向记录为当前方向。
2.1.3轮廓跟踪规则
根据前一步的走向,即当前方向,确定下一步的可能走向(3个可选方向)。
下一步走向的三个可选方向分别为当前方向以及对应于8方向码(如图4)中的当前方向的两个邻接方向。
例如:
若当前方向为4,则下一步的可选方向为3、4、5;若当前方向为5,则下一步的可选方向为4、5、6;其余同理。
对3个可能走向分别以从当前点沿该方向前进一点作为候选点,得到3个候选点,将每个候选点对应于卷积模板的中心元素求卷积。
模板的选取是根据从当前点到该候选点的方向(称为候选方向)确定的,每个不同的候选方向对应于不同的卷积模板进行计算。
若候选方向为0或4,选用0度方向模板;若候选方向为1或5,用135度方向模板;若候选方向为2或6,用90度方向模板;若候选方向为3或7,用45度方向模板,四个方向的卷积模板如图5所示。
对3个候选点分别用与之相对应的方向梯度卷积模板求卷积,求得的值即为与该候选点的走向垂直方向上的梯度。
当某一候选点位于手形轮廓真实边缘时,其垂直于边缘方向的梯度在三个候选点中应呈现出最大值。
因此3个候选点中梯度绝对值最大的点以及该点对应的方向即为下一轮廓点及下一步走向。
将找到的下一轮廓点作为新的当前点,将其对应的方向作为新的当前方向,循环此过程,直至遇到终止条件结束跟踪。
0度方向模板检测的是垂直方向的梯度,45度方向模板检测的是135度方向的梯度,其余两个方向模板同理。
2.1.4轮廓跟踪的终止条件
依据模板窗口大小和跟踪结束时的轮廓走向,当当前点的横坐标距离图像右侧边界小于3个像素的距离,且跟踪方向为0或1或7时,跟踪结束。
2.2算法步骤
(1)对图像中最右列的上数第四点至下数第四点之间的像素逐点用模板1做卷积,卷积所得的值最大的点记为轮廓跟踪的起始点。
若得到两个(或两个以上)值最大的点,则将模板1上下各增加一个元素,用新模板对这两点重新做卷积,直至只得到一个最大值为止。
初始化轮廓数组,并将起始点存入轮廓数组。
(2)将起始点的左侧邻域三点分别作为候选点,依据公式
(1)计算得到第二轮廓点。
再以第二轮廓点左侧邻域三点为候选点,用同样方法找到第三轮廓点。
将第二、第三轮廓点分别存入轮廓数组。
将第三轮廓点作为当前点CurrentPoint,将第二轮廓点到第三轮廓点的方向记录为当前方向CurrentDirection。
(3)将当前方向CurrentDirection以及对应于图4方向码中当前方向的两个邻接方向作为下一步的3个可能走向。
(4)从当前点沿着每个可能走向分别前进一点作为候选点。
对每个候选点,依据从当前点到该候选点的方向,从图5中选取与该方向相对应的卷积模板,将该候选点对应于模板中心元素求卷积,将卷积结果的绝对值作为该候选点的灰度梯度值。
(5)比较第(4)步中3个候选点的灰度梯度值的大小,将值最大的候选点作为下一个轮廓点(若3个候选点的灰度梯度值出现相等的情况,则若出现相等情况的点中包括中心方向上的点,则取中心方向上的点作为下一轮廓点;否则,取中心方向右侧方向上的点作为下一轮廓点)。
将找到的轮廓点存入轮廓数组,将当前方向更新为从当前点到该轮廓点的方向,再将当前点更新为该轮廓点。
(6)判断当前点坐标是否满足结束条件。
若当前点的横坐标距离图像右侧边界小于3个像素,且跟踪方向为0或1或7时,跟踪结束,否则转(3)继续执行。
参考文献:
《基于方向梯度极值的手形轮廓跟踪算法》,苑玮琦,董茜,桑海峰,沈阳工业大学视觉检测技术研究所。
3实验结果
处理图像:
代码程序:
建立10个m文件
er.m,fangxianghans.m,gezhongsuanfa.m,juanji.m,lunkuo.m,moban.m,qishi.m,san.m,Untitled.m,youle.m,最终运行Untitled文件,代码如下:
1、er.m:
functionsecondpoint=er(firstpoint,I)
[MN]=size(I);
fori=1:
3
chazhi(i)=I(M-1,firstpoint+i-1)-I(M-1,firstpoint+i-2);
end
second=find(chazhi==max(chazhi));
secondpoint=firstpoint+second
(1)-1;
2、fangxianghans.m:
functionfangxiang=fangxianghans(yqian,xqian,yhou,xhou)
fang2=xhou-xqian;%10-1左右
fang1=yhou-yqian;%10-1上下
iffang1==0&&fang2==-1%向左左1
fangxiang=1;
end
iffang1==-1&&fang2==-1%向左上左上2
fangxiang=2;
end
iffang1==-1&&fang2==0%向上
fangxiang=3;
end
iffang1==-1&&fang2==1%向右上右上4
fangxiang=4;
end
iffang1==0&&fang2==1%向右右5
fangxiang=5;
end
iffang1==1&&fang2==1%向右下右下6
fangxiang=6;
end
iffang1==1&&fang2==0%向下
fangxiang=7;
end
iffang1==1&&fang2==-1%向左下左下8
fangxiang=8;
end
fangxiang=fangxiang;
3、gezhongsuanfa.m:
clear;
I=imread('5.bmp');%读图片
%figure;
%imshow(I);%原图像显示
%i2=im2bw(I,0.30);%二值化
%imshow(i2);%二值化显示
BW=edge(I,'sobel',0.3);
figure;
imshow(BW);%原图像显示
title('soble');
BW=edge(I,'prewitt');
figure;
imshow(BW);%原图像显示
title('prewitt');
BW=edge(I,'roberts');
figure;
imshow(BW);%原图像显示
title('roberts');
BW=edge(I,'log');
figure;
imshow(BW);%原图像显示
title('log');
BW=edge(I,'canny');
figure;
imshow(BW);%原图像显示
title('canny');
4、juanji.m:
functionpointvalue=juanji(xianpointy,xianpointx,I,y,x,moban)
wei_y=xianpointy+y;
wei_x=xianpointx+x;
I=im2double(I);
pointvalues=0;
forii=1:
5
forjj=1:
5pointvalues=I(wei_y+ii-3,wei_x+jj-3)*moban(ii,jj)+pointvalues;
end
end
pointvalue=abs(pointvalues);
5、lunkuo.m:
functionI_lunkuo=lunkuo(secondpoint,thirdpoint,I)
[MN]=size(I);
%fangxiang=fangxianghans(M,secondpoint,M-1,thirdpoint);
%xianpointx=thirdpoint;
%xianpointy=secondpoint;
points
(2)=secondpoint;
points
(1)=M-1;
point
(2)=thirdpoint;
point
(1)=M-2;
flag=1;
count=4;
lunkuopoint(1,1)=1;
lunkuopoint(1,2)=1;
lunkuopoint(2,1)=M-1;
lunkuopoint(2,2)=secondpoint;
lunkuopoint(3,1)=M-2;
lunkuopoint(3,2)=thirdpoint;
whileflag==1
fangxiang=fangxianghans(points
(1),points
(2),point
(1),point
(2));
xianpointy=point
(1);
xianpointx=point
(2);
pointqian=moban(fangxiang,xianpointy,xianpointx,I);
points=point;
point=pointqian;
ifpoint
(1)==M-2&&point
(2)~=thirdpoint
%ifcount==M-10
flag=0;
end
%ifpoint
(1)==M-5&&point
(2)~=thirdpoint
%ifcount==200
%flag=0;
%end
lunkuopoint(count,1)=point
(1);
lunkuopoint(count,2)=point
(2);
count=count+1;
end
[MN]=size(I);
forii=1:
M
forjj=1:
N
I_lunkuo(ii,jj)=0;
end
end
foriii=1:
count-2
I_lunkuo(lunkuopoint(iii,1),lunkuopoint(iii,2))=255;
end
mm=lunkuopoint;
6、moban.m:
functionpointqian=moban(fangxiang,xianpointy,xianpointx,I)
moban1=[01110;
01110;
00000;
0-1-1-10;
0-1-1-10];
moban2=[01100;
11100;
110-1-1;
00-1-1-1;
00-1-10];
moban3=[00000;
110-1-1;
110-1-1;
110-1-1;
00000];
moban4=[00110;
00111;
-1-1011;
-1-1-100;
-1-1000];
%a=1111
switchfangxiang
case1
pointqian1=juanji(xianpointy,xianpointx,I,1,-1,moban2);%向左下84
pointqian2=juanji(xianpointy,xianpointx,I,0,-1,moban1);%继续向左11
pointqian3=juanji(xianpointy,xianpointx,I,-1,-1,moban4);%向左上22
case2
pointqian1=juanji(xianpointy,xianpointx,I,0,-1,moban1);%向左11
pointqian2=juanji(xianpointy,xianpointx,I,-1,-1,moban4);%继续左上22
pointqian3=juanji(xianpointy,xianpointx,I,-1,0,moban3);%向上33
case3
pointqian1=juanji(xianpointy,xianpointx,I,-1,-1,moban4);%向左上24
pointqian2=juanji(xianpointy,xianpointx,I,-1,0,moban3);%继续向上33
pointqian3=juanji(xianpointy,xianpointx,I,-1,1,moban2);%向右上42
case4
pointqian1=juanji(xianpointy,xianpointx,I,-1,0,moban3);%向上3
pointqian2=juanji(xianpointy,xianpointx,I,-1,1,moban2);%继续右上42
pointqian3=juanji(xianpointy,xianpointx,I,0,1,moban1);%向右5
case5
pointqian1=juanji(xianpointy,xianpointx,I,-1,1,moban2);%向右上42
pointqian2=juanji(xianpointy,xianpointx,I,0,1,moban1);%继续向右5
pointqian3=juanji(xianpointy,xianpointx,I,1,1,moban4);%向右下62
case6
pointqian1=juanji(xianpointy,xianpointx,I,0,1,moban1);%向右5
pointqian2=juanji(xianpointy,xianpointx,I,1,1,moban4);%继续右下6
pointqian3=juanji(xianpointy,xianpointx,I,1,0,moban3);%向下7
case7