一种基于三角形的图像轮廓匹配算法

文档序号:6636771阅读:550来源:国知局
一种基于三角形的图像轮廓匹配算法
【专利摘要】本发明公开了一种基于三角形的图像轮廓匹配算法,其包括以下步骤:在待检索图像的轮廓上任意选择一点记为C;将与点C不直接相邻的点记为A,寻找垂直AC于C点的直线,且该直线与待检索图像的轮廓存在交点B,构件成了对应的直角三角形ABC;如果AC大于BC,则将BC除以AC的值记为R,如果AC小于BC,则将AC除以BC的值记为R;得出最小值Rmin和最大值Rmax;预设出需要检索图像库中每一个图像的Rmin[N]的数组和Rmax[N]的数组;将待检测图像的最小值Rmin和最大值Rmax分别和需要检索的图像库中各个图像的Rmin[N]和Rmax[N]数组进行比对;如果同一个点的Rmin和Rmax都是匹配的,则两幅图像轮廓匹配。本发明的算法匹配准确度高,算法方便、简单,计算速度快,且适用范围广。
【专利说明】—种基于三角形的图像轮廓匹配算法

【技术领域】
[0001]本发明属于图像匹配【技术领域】,具体涉及一种基于三角形的图像轮廓匹配算法。

【背景技术】
[0002]当人们观察周围环境时,首先注意到的是物体及其周围环境的颜色、纹理、形状和空间关系等等。形状是物体最基本的有感觉意义的特征之一,并且具有较好的不变性。在计算机视觉的模式识别中,形状是对目标范围的二值图像表示,可以看成是目标轮廓,它是用于目标识别的重要特征。在机器识别事物的过程中,经常需要将已知图像的轮廓与陌生图像的轮廓全部或者部分在空间上配准,根据已知模式的形状在一幅陌生图像中寻找对应该模式的子形状,这个过程就是形状匹配。我们将已知的形状或已知模式的形状称为模板,在陌生物体轮廓形状中可能与它对应的子图称作该模板的潜在匹配子形状。形状匹配时衡量形状见相似性的一种技术,在众多领域得到可广泛的应用,如文字识别、目标识别、碎片复原、基于内容的图像检索和医疗诊断等。因此,开展轮廓匹配技术的研究具有重要的理论意义和实用价值。
[0003]现有轮廓匹配技术有以下几种:
一、Hu 矩
Hu矩是归一化中心矩的线性组合,其主要是使用对变换不敏感的基于区域的几个矩。Hu.M.K在1962年提出了 7个这样的矩,并将它们构成一组特征量,并被证明具有平移、缩放和旋转不变性。实际上,在对图像中物体识别的过程中,只有前两个矩不变性保持的比较好,其他的几个不变矩带来的误差比较大,有学者认为只有基于二阶矩的不变矩对二维物体的描述才是真正的具有旋转、缩放和平移不变性。由Hu矩组成的特征量对图片进行识另O,优点就是速度很快,缺点是识别率比较低,这一部分是由于Hu不变矩只用到低阶矩(最多也就用到三阶矩),对于图像的细节未能很好的描述出来,导致对图像的描述不够完整。Hu不变矩一般用来识别图像中大的物体,对于物体的形状描述的比较好,图像的纹理特征不能太复杂,像识别水果的形状,或者对于车牌中的简单字符的识别效果会相对好一些。
[0004]二、基于角点的轮廓匹配
X.C.He和Nelson.H.C.Yung提出了一种基于曲率的角点检测方法。该方法的原理是利用图像全局和局部的曲率特性,在提取角点时综合考虑其影响。
[0005]由于距离和曲率具有平移、旋转不变性,因此该方法能克服图像间平移和旋转的变化。但是对于不同分辨率的图像,基于该方法提取的角点并不完全一致。这主要是由于轮廓=提取的结果难免会存在一些局部突变和毛刺现象,造成整个轮廓曲线的不光滑,而基于曲率的角点提取对曲线上的每一个点计算曲率,因此容易受噪声的影响。
[0006]三、链码直方图
方向链码(Freeman链码)是用来表示物体轮廓的典型链码表示法。一条离散曲线可以定义为Z2域内一组数量有蒂娜的8联通店。因此,一条数字化二值曲线可以用方向链码表示相信两像素连线的8中可能的方向值。
[0007]链码法的特点:
(O计算量小,可满足实时性要求;
(2)具有平移、尺度不变性;
(3)具有90度旋转不变性;
(4)规格化链码直方图可以达到更好的旋转不变性。
[0008]但链码直方图将人眼看上去相似的物体归为一类,因此不能进行精确地识别和分类。


【发明内容】

[0009]为了解决现有技术中存在的上述问题,本发明的目的是提供一种匹配准确度高,算法方便、简单,计算速度快,且适用范围广的基于三角形的图像轮廓匹配算法。
[0010]为实现上述目的,本发明采用的技术方案为:一种基于三角形的图像轮廓匹配算法,其包括以下步骤:
步骤SI,在待检索图像的轮廓上任意选择一点记为C ;将待检索图像的轮廓上任意一与点C不直接相邻的点记为A,得到直线AC ;寻找垂直AC于C点的直线,且该直线与待检索图像的轮廓存在交点,将这些交点中与C点最近的点记为点B,则构件成了对应的直角三角形ABC ;如果AC大于BC,则将BC除以AC的值记为R,如果AC小于BC,则将AC除以BC的值记为R ;对于待检测图像轮廓上多个不同的与C不相邻的一系列点Ai,得到对应的一系列Ri ;取出最小值Rmin和最大值Rmax ;
步骤S2,对需要检索的图像库中各个图像按照步骤SI中分方法对每一个图像进行相同操作,图像库中每一个图像得到得一个Rmin[N]的数组和Rmax[N]的数组,N为每个图像的点数;
步骤S3,将待检测图像的最小值Rmin和最大值Rmax分别和需要检索的图像库中各个图像的Rmin[N]和Rmax[N]数组进行比对;如果同一个点的Rmin和Rmax都是匹配的,贝Ij需要检索的图像库中的该图像与待检测图像中对应的直角三角形是匹配的,也即两幅图像轮廓匹配;如果同一个点的Rmin和Rmax不匹配,则两幅图像轮廓不匹配。
[0011]优选方案,所述步骤S1、步骤S2和步骤S3为分别选择一系列的点Ci,分别对这一系列的点Ci的R值进行匹配。采用匹配多个不同待检测图像的Ci和需要检索的图像库中各图像的C/点,可以进一步提高匹配的准确度。
[0012]当然,其它三角形匹配算法基本也是类似的,如果顶角不是90度,也可以选其它任意角度,如30度,45度,60度等,但90度的算法是最方便,最简单的。
[0013]采用以上技术方案,本发明的有益效果为:
1.匹配准确度高:
因为采用的是三角形精确匹配,在不考虑实际图像的现实意义,只是纯图形意义的比较情况下,对应顶点是100%完全匹配的。即使考虑这些图像在实际生活中的各种情况,匹配精确度也在95%以上,并且可以用多点比较的办法进一步提高匹配精确度。
[0014]2.算法复杂度低,计算和匹配速度快。
[0015]对待检图像的轮廓点,只需要有限几次单重遍历。对待库中图像的轮廓,只有一次双重遍历,而且图像库都是可以预先处理并保存结果数据的。而且计算直线的算法也是很简单的两三次乘除运算。
[0016]3.适用范围广:
不仅可以使用于最广泛的日常生活图像和视频;也适用于大量的专业图像如医疗图像、卫星图像、遥感图像、气象图像等;还实用于各种人工生成的图像,如几何图形、卡通图形,设计图纸等等。

【专利附图】

【附图说明】
[0017]图1为本发明基于三角形的图像轮廓匹配算法的方案示意框图。

【具体实施方式】
[0018]为使本发明的目的、技术方案和优点更加清楚明了,下面结合【具体实施方式】并参照附图,对本发明进一步详细说明。应该理解,这些描述只是示例性的,而并非要限制本发明的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明的概念。
[0019]现在主流的计算机图像都是像素点组成的矩阵,图像轮廓就相当于不规则的多边形,而多边形在数学上可以用若干个三角形组合而成。图像讲过缩放、旋转、镜像等变换之后,这些组成轮廓的三角形的大小尺度可能会改变,但是其形状和比例是不会改变的。如果我们在不同的图像轮廓中能够找到这些对应的形状一致的三角形,我们认为这些对应的三角形顶点组成的轮廓是匹配的。
[0020]一种基于三角形的图像轮廓匹配算法,其包括以下步骤:
步骤SI,运用直角三角形算法处理待检索图像上选择的需要匹配的点;即在待检索图像的轮廓上任意选择一点记为C;将待检索图像的轮廓上任意一与点C不直接相邻的点记为A,得到直线AC ;寻找垂直AC于C点的直线,且该直线与待检索图像的轮廓存在交点,将这些交点中与C点最近的点记为点B,则构件成了对应的直角三角形ABC ;如果AC大于BC,则将BC除以AC的值记为R,如果AC小于BC,则将AC除以BC的值记为R ;对于待检测图像轮廓上多个不同的与C不相邻的一系列点Ai,得到对应的一系列Ri ;取出最小值Rmin和最大值Rmax ;
步骤S2,运用直角三角形算法处理需要检索的图像库中各个图像的轮廓指定点;即对需要检索的图像库中各个图像按照步骤SI中分方法对每一个图像进行相同操作,图像库中每一个图像得到得一个Rmin [N]的数组和Rmax [N]的数组,N为每个图像的点数;
步骤S3,将每一个待匹配的点的Rmin和Rmax在对应的Rmin[N]和Rmax[N]数组中寻找匹配项;即将待检测图像的最小值Rmin和最大值Rmax分别和需要检索的图像库中各个图像的Rmin[N]和Rmax[N]数组进行比对;如果同一个点的Rmin和Rmax都是匹配的,贝Ij需要检索的图像库中的该图像与待检测图像中对应的直角三角形是匹配的,也即两幅图像轮廓匹配;如果同一个点的Rmin和Rmax不匹配,则两幅图像轮廓不匹配。
[0021 ] 为进一步提高匹配的准确度,所述步骤S1、步骤S2和步骤S3为分别选择一系列的点Ci,分别对这一系列的点Ci的R值进行匹配。匹配多个不同待检测图像的Ci和需要检索的图像库中各图像的C/点,提高了匹配的准确度。
[0022]当然,其它三角形匹配算法基本也是类似的,如果顶角不是90度,也可以选其它任意角度,如30度,45度,60度等,但90度的算法是最方便,最简单的。
[0023]为了进一步说明本发明,以下提供了基于标准C++的参考实现,当然其常用的开发环境可以是:如windows平台下的visual stud1; linux/unix平台下的gcc/g++等都可编译通过。而且其它编程语言和系统平台也可以轻易移植。本实施例的C++详见见下面的代码内容。
[0024]typedef struct _tagPhRat1
{ double rmin;
double rmax;
}PHRA1;
//交换数值,保持X〈 y
void swap (double x,double y)
{ double t;
if(x > y)
{t = y;y = x;x = t;}
}
double Distance (int xl,int yl,int x2,int y2)
{ return sqrt ((xl~x2)^(xl~x2) + (yl-y2)^(yl-y2));
}
//在轮廓图上扫描轮廓点
int ScanEdgePoints(IMAGED img, P0INT*& edgepoints)
{ int col = 0, row = 0;
int nEdgePointCount = 0;
for (row=0; row < img->height; row++)
{ for (col=0; col< img->width; col++)
{ //判断是否为轮廓点
if(img->imageData[row * img->widthStep + col] > 0 )
nEdgePointCount ++;

}
}
if (nEdgePointCount == 0) return 0;
edgepoints = new POINT[nEdgePointCount];
assert (edgepoints != 0x00);
int nlndex = 0;
for (row=0; row < img->height; row++)
{for (col=0; col< img->width; col++)
{if (img->imageData[row * img->widthStep + col] > 0 )

{ edgepoints [nlndex ].x = col;
edgepoints [nlndex ].y = row;
nlndex++;

}

}
}
return nEdgePointCount;
}
bool FindRat1(IMAGE* img, POINT* edgepoints, int nEdgePointsCount, intnPointCIndex, \

doubIe& rat1—min, doubIe& rat1—max)
{ int y = 0;
double ACWidth=Oj
double BCWidth=O;
double rat1_cur = 0;
for (int j=0; j<nEdgePointsCount; j++)
{if (nPointCIndex == j) continue;
ACWidth = Distance (edgepoints [nPointCIndex].x,edgepoints[nPointCIndex].y, \
edgepoints[j].x, edgepoints[j].y);
if (ACWidth <= I) continue; //忽略直接相邻点
double k = 0;
if (edgepoints [ j].y != edgepoints [nPointCIndex].y)
k= (edgepoints[j].x - edgepoints[nPointCIndex].x) / \
(edgepoints[j].y - edgepoints[nPointCIndex].y);
//直线BC的方程
y = ο;
for (int x=edgepoints [nPointCIndex].x -1; x > 0; x—)
{y = int ( _k 木(x - edgepoints [nPointCIndex].x) - edgepoints[nPointCIndex].y);
if(y>0 I I y < -1mg ->height) continue; //超过范围了,没有交点
if(img->imageData[ (-y) * img->widthStep + x] > 0 )

{BCWidth = Distance (edgepoints [nPointCIndex].x, edgepoints[nPointCIndex].y, \
x, -y);

swap (ACWidth, BCWidth); // 使 ACWidth < BCWidth
rat1—cur = ACWidth / BCWidth;

if (rat1—min >= rat1_cur) rat1—min = rat1_cur;
if (rat1—max <= rat1_cur) rat1—max = rat1_cur;
break; //找到直线BC和轮廓的交点了,退出

}

}
//直线BC’的方程
y = O;
for (int X = edgepoints [nPointCIndex].x +1; x < img->width; x++)

{

y = int ( _k 木(x - edgepoints [nPointCIndex].x) - edgepoints[nPointCIndex].y);
if(y>0 I I y< -1mg->height) continue; //超过范围了,没有交点
if(img->imageData[ (-y) * img->widthStep + x] > 0 )

{

BCWidth = Distance (edgepoints [nPointCIndex].x, edgepoints[nPointCIndex].y, \
x, -y);
swap(ACWidth, BCWidth); // 使 ACWidth < BCWidth
rat1—cur = ACWidth / BCWidth;
if (rat1—min >= rat1_cur) rat1—min = rat1_cur;
if (rat1—max <= rat1_cur) rat1—max = rat1_cur;
break; //找到直线BC’和轮廓的交点了,退出

}

}
}
return true;
}
bool TriangleMatch(IMAGE* libimg, IMAGE* targetimg)
{
POINT* edgepoints = OxOO;
int nEdgePointCount = ScanEdgePoints(libimg, edgepoints);
if (nEdgePointCount <=0) return false;
//对图像库中某个图像进行处理
PHRA1* rat1—array = new PHRA1[nEdgePointCount];
memset(rat1_array, 0,sizeof (rat1_array));
for (int i=0; i< nEdgePointCount; i++)
{ double rat1—max = 0;
double rat1—min = 10000;
if(FindRat1 (libimg, edgepoints, nEdgePointCount, i,rat1—min,
rat1—max))
{ rat1_array [i].rmin = rat1—min;
rat1_array [i].rmax = rat1—max;

}

} //对待比较图像进行处理 POINT* edgepoints—t = OxOO;
int nEdgePointCount_t = ScanEdgePoints (targetimg,edgepoints_t);
if (nEdgePointCount—t <=0) return false;
double rat1—max_t = 0;
double rat1—min_t = 10000;
if (FindRat1(targetimg, edgepoints_t,nEdgePointCount_t, 0,rat1—min_t,rat1—max_t))
//比较rat1的值,可以比较待比较图像上目标轮廓上的多个点已提高准确程度。
for (int k = 0; k<nEdgePointCount; k++)
{if ((abs (rat1—min_t - rat1_array [k].rmin)<=( rat1—min_t * 0.05))
&&\
(abs (rat1—max_t - rat1_array [k].rmax)<=( rat1—max_t ^0.05)))
{ delete rat1_array;
return true;

}
}
delete rat1_array;
return false;
}//TriagleMatch
应当理解的是,本发明的上述【具体实施方式】仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。
【权利要求】
1.一种基于三角形的图像轮廓匹配算法,其包括以下步骤: 步骤SI,在待检索图像的轮廓上任意选择一点记为C ;将待检索图像的轮廓上任意一与点C不直接相邻的点记为A,得到直线AC ;寻找垂直AC于C点的直线,且该直线与待检索图像的轮廓存在交点,将这些交点中与C点最近的点记为点B,则构件成了对应的直角三角形ABC ;如果AC大于BC,则将BC除以AC的值记为R,如果AC小于BC,则将AC除以BC的值记为R ;对于待检测图像轮廓上多个不同的与C不相邻的一系列点Ai,得到对应的一系列Ri ;取出最小值Rmin和最大值Rmax ; 步骤S2,对需要检索的图像库中各个图像按照步骤SI中分方法对每一个图像进行相同操作,图像库中每一个图像得到得一个Rmin[N]的数组和Rmax[N]的数组,N为每个图像的点数; 步骤S3,将待检测图像的最小值Rmin和最大值Rmax分别和需要检索的图像库中各个图像的Rmin[N]和Rmax[N]数组进行比对;如果同一个点的Rmin和Rmax都是匹配的,贝Ij需要检索的图像库中的该图像与待检测图像中对应的直角三角形是匹配的,也即两幅图像轮廓匹配;如果同一个点的Rmin和Rmax不匹配,则两幅图像轮廓不匹配。
2.根据权利要求1所述的一种基于三角形的图像轮廓匹配算法,其特征在于,所述步骤S1、步骤S2和步骤S3为分别选择一系列的点Ci,分别对这一系列的点Ci的R值进行匹配。
【文档编号】G06T7/00GK104408726SQ201410716389
【公开日】2015年3月11日 申请日期:2014年12月2日 优先权日:2014年12月2日
【发明者】许书华 申请人:上海许书华电子科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1