搜档网
当前位置:搜档网 › 字符串匹配算法的研究_本科论文

字符串匹配算法的研究_本科论文

字符串匹配算法的研究_本科论文
字符串匹配算法的研究_本科论文

字符串匹配算法的研究及其程序实现

计算机学院计算机科学与技术专业2007级指导教师:滕云

摘要:在字符串匹配算法之中,最古老和最著名的是由D. E. Knuth, J. h. Morris, V. R. Pratt 在1997年共同提出的KMP算法。直至今日,人们对字符串匹配问题还在进行着大量的研究,以寻求更简单,或者平均时间复杂度更优的算法;学者们在不同的研究方向上,设计出了很多有效的匹配算法。在现实生活中,串匹配技术的应用十分广泛,其主要领域包括:入侵检测,病毒检测,信息检索,信息过滤,计算生物学,金融检测等等。在许多应用系统中,串匹配所占的时间比重相当大,因此,串匹配算法的速度很大程度上影响着整个系统的性能。该论文重点分析了KMP算法的实现原理和C语言实现,并在此基础上提出了改进的KMP算法,使得该算法更方便实用。

关键词:KMP算法;时间复杂度;串匹配;改进;方便使用;

String matching algorithm and Implementation of the Program College of Computer Sciences, Computer Science and Technology Professional

grade 2007, Instructor YunTeng

Abstractor:Among the string matching algorithm,the oldest and most famous is KMP algorithm co-sponsored by D.E Knuth, J. h. Morris, VR Pratt in 1997. As of today, a lot of research to String matching are still in progress, to seek a more simply or better average time complexity of the algorithm. In different research direction, scholars have designed a lot of valid matching.In real life, the string matching technique is widely used,The main areas include: intrusion detection, virus detection, information retrieval, information filtering, computational biology, financial inspection and so on.In many applications,a large percentage of the time was placed by the string matching, so the string matching algorithms significantly affect the speed performance of the whole system.The paper analyzes the implementation of the KMP algorithm theory and through the C language to achieve it.And we puts forward a modified KMP algorithm in order to makes the algorithm more convenient and practical.

Key words:KMP algorithm; Time complexity; String matching; Improved; Easy to use;

目录

摘要﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒ 1 ABSTRACT﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒ 1

第一章引言﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒ 3

第一节:字符串匹配研究的目的和意义﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒3

第二节:本文的内容和安排﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒ 3

第二章串匹配算法的概念与研究现状﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒ 4

第一节:字符串匹配的有关概念﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒4

第二节:字符串匹配算法的研究现状﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒4

第三章KMP算法和BM算法及其改进算法的研究及实现﹒﹒﹒﹒﹒﹒5 第一节:KMP算法的研究及实现﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒5

第二节:KMP算法改进及其程序实现﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒8

第四章总结和展望﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒12 第一节:总结﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒13

第二节:展望﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒13

参考文献﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒14

致谢﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒14

第一章:引言

第一节:字符串匹配研究的目的和意义

字符串是计算机科学中常见的基本概念,搜索问题也是计算机科学中的基本问题。而且迄今为止文本信息仍然还是最主要的信息交换手段之一,因此作为文本处理中的一个重要领域——字符串匹配,就显得尤其的重要,随着互联网的日渐庞大,信息也是越来越多,如何在海量的信息中快速查找自己所要的信息是网络搜索研究的热点所在;在这其中,字符串匹配算法起着非常重要的作用,一个高效的字符串匹配算法,可以极大的提高搜索的效率和质量。本文力图阐明字符串匹配算法的发展过程中的两个重要的算法KMP算法和BM算法,并且并介绍了

各个算法的特点,并给予了适当的比较和分析,进而提出了新的字符串匹配算法希望能够在各方面有所改进。

字符串匹配技术有着十分广泛的应用领域,它的最直接的应用领域是构建数据的全文检索系统和图书文献目录摘要的查询系统。尤其在近年来,网络技术马不停蹄的快速发展,网络带宽不断增加,随之出现的问题也越来越多,加之随着网络技术和生物技术的不断发展,串模式匹配技术又在网络安全,网络信息检索和生物计算等领域中发挥着重要作用,并不断发展。而且在对大量黄色信息,反动言论和国家机密的过滤方面以及入侵检测技术和内容过滤技术方面字符串匹配算法也扮演者一个不可或缺的角色。

随着生命科学技术的发展,人们对生命物质的微观结构的认识越来越清晰。而且人类基因组序列的绘制工作目前己经完成。计算生物学中的一个最基本问题是,寻找一个或一组基因片断在一个基因序列中的出现位置,以比较基因的相似性和遗传关系;或者根据己知的蛋白质样本去匹配未知的蛋白质序列,来确定这种未知的蛋白质序列所属蛋白质的种类和功能。由于蛋白质和基因都可以使用建立在一定字符集上的符号序列来表示,因而传统的字符串匹配技术又有了新的发挥之地。尤其是近些年来的发展,科学家们对基因发生的突变和进化等变化进行研究,来描述同一物种的基因序列可能存在一定的差别,所以这就促进了“近似匹配”技术的又一提高和发展。

综上所述,字符串匹配技术在众多的领域中发挥着基础的核心作用,对字符串匹配算法作进一步的研究和改进,对于提高执行的效率、增加应用系统的性能、节约硬件成本等有着重要的现实意义。

第二节:本文的内容和安排

本文通过对经典字符串匹配算法的深入理解和分析,在KMP算法的基础上提出了两种改进算法,并且给出了程序实现代码,经过分析和测试确定其性能得到提高,在某些方面都达到了较高的水平。

本文的后续的章节安排为:第二章将对字符串匹配算法的概念进行归纳并总结其研究现状;第三章详细分析字符串匹配算法:KMP算法,并提出相应的新的改进算法,而且深入分析所涉及到的经典算法的思想以及程序的实现方法,并且将改进后的算法与之比较,得出改进后算法的优点。最后第四章进行总结和展望。

第二章串匹配算法的概念与研究现状

第一节:字符串匹配的有关概念

字符串是n ( 0 ) 个字符的有限序列,记作 S : “c0c1c2…cn-1”。其中,S是串名字;“c0c1c2…cn-1”是串值;ci是串中字符;n是串的长度。如:“Welcome to Linux world !!!”

模式匹配是串的基本运算之一。它是指在串中寻找子串(第一个字符)在串中的位置。有两个字符串T和S,字符串T称为正文,字符串S称为模式,要求找出模式S在正文T中的首次出现的位置。一旦模式S在正文T中找到,就说发生一次匹配。有些应用可能会要求找出所有的匹配位置。

算法复杂度分为时间复杂度和空间复杂度。其作用:时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小。

KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法的时间复杂度为O(m+n).

第二节:字符串匹配算法的研究现状

近年来,学术界的兴趣与日俱增,特别在生物信息学和信息检索两个领域中,需要处理的文本规模越来越大,而且需要在文本中进行越来越复杂的搜索。因此,出现了一种非标准的模式匹配问题,该问题涵盖的内容包括通配符、近似匹配等等。近期,学术界最活跃的问题之一就是研究带有通配符的串匹配问题。即带有don't care或wildcard字符。然而,通配符的引入会让问题定义更加灵活,却也带来了复杂性。

算法的设计有时不仅仅考虑时空效率,保证匹配结果的完备性很可能成为算法设计更重要的问题。在串匹配研究领域中,一个人所共知的事实是“算法的思想越简单,实际应用的效果越好”。另外,随着新一代计算机的产生,会出现一些新技术,例如位并行等。

然而KMP算法依然占据着不可替代的作用,尤其是他们的优化版更是应用广泛。

第三章:KMP算法和BM算法及其改进算法的研究及实现

第一节:KMP算法的研究及实现

KMP算法是一种线性时间复杂的字符串匹配算法,它是对BF算法(Brute-Force,最基本的字符串匹配算法的)改进。由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称

KMP算法)。KMP算法的关键是根据给定的模式串W1,m,定义一个next函数。next 函数包含了模式串本身局部匹配的信息。

首先,我们引入一个叫失败链接值(faillink)的概念,就是说“每当一趟匹配过程中出现字符比较不等时,不需回溯i指针,而是利用已经得到的…部分匹配?结果(匹配串的每个字符的失败链接值)将模式(匹配子串)向右…滑动?尽可能远的一段距离,继续进行比较。”其实质失败链接值就是一个和主串完全无关只和子串相关的值。

当子串某一位和主串“失配”了(其实这句话还应该理解为到子串这一位前面的都和主串“相配”),则跳到失败链接值的那一位上去(简称失败链接位),使得失败链接位上的那个字符继续和主串当前字符进行比较,如果不匹配再跳到失败链接位的失败链接位上去,如果还不匹配就接着往前跳,一直跳到某一位和主串目前位置上的字符相同或者跳到子串最开头为止。

而这个失败链接位是怎么求出来的呢,举个例子来说,子串为"aac",我们现在要求的是'c'这一位(j=2)所对应的失败链接值,也就是说,'c'前面部分即"aa"已经和主串相配了,而'c'没能和主串相配,那么要跳到前面的哪一位上去呢,假设主串是"aa ab"(绿色部分的aa已经确定),那么,子串只要向右移动1位即做到如下对应即可:

主串: a a a b a a a b

字串: a a c ——> a a c

|||

位置:0 1 2

也就是在0~j-1之间(在这儿是0~1之间)找到一个数k(在这里是1),使得'c'前面k位字符串和子串的第k位前面k位字符串相等,这么一来就能保证在子串向右移动(也就是k指针向子串左边的错误链接位跳)了之后仍然有k指针指向的那一位前面的k长度部分的字符串和j指针指向的那一位前面的k长度部分的字符串即主串i指针指向的那一位前面的k长度部分的字符串相同,这也正是移动后(即j跳到k所指位置后)仍能保证j前面部分和主串i前面相同长度部分字符串相同的必要条件。这个k的值也就成为了j的失败链接值(即flink[j]=k),k所对应的位置就成了j所对应位置的失败链接位.。

如果错误链接位上字符和当前位上字符相同的话,可以直接让当前位的错误链接值等于错误链接位的错误链接值(当然都是就子串来说的),这样可以将程序更加优化。

求s的各字符的失败链接值算法:引入数组next[],元素个数为S的长度,

依次存放S各字符的失败链接值。先置next[0] = -1,在已求得next[0],…,next[j-1]的情况下,求next[j].如next[j-1]=k,又有s[k]=s[j-1],那末置next[j]为next[j-1]+1;如果s[k]≠s[j-1],令k1=next[k],如有s[k1]=s[j-1],则置next[j]为k1+1;如果s[k1]≠s[j-1],则按s[k1]的失败链接值再继续寻找,直至找到一个失败链接值kn,使得s[kn]=s[j-1],或者kn = -1,这时就置next[j] = kn+1。

寻找模式各字符失败链接值的函数:

void faillink(char *s, int next[])

{

int j, k;

next[0] = -1;

for(j = 1;s[j] != '\0';j++) { k = next[j-1];

while (k != -1 && s[k+1] != s[j])

k = next[k];

if(s[j]==s[k+1]) next[j] = k+1;

else next[j] = -1;

}

}

具体的KMP算法C语言实现代码如下:假设又两个随机的字符串S和T,例如主串S=acdfgawedgawekmah和子串T=gawek,则由此可知其其匹配的起始下标为10。

#include

#include

#define N 50

void GetNext(char t[],int next[])

{

next[1]=0;

int j=1,k=0,h;

h=strlen(t);

while(j

if((k==0)||(t[j]==t[k]))

{

j++;

k++;

next[j]=k;break;

}

else k=next[k];

}

void main()

{

printf("姓名李春豹学号200713140114\n");

char s[N],t[N];

int next[N]={0};

printf("请输入主串s:\n");

gets(s);

printf("请输入模式串t:\n");

gets(t);

int i=1,j=1,k=strlen(s)-1,h=strlen(t)-1;

while((i<=k)&&(j<=h))

{

if(s[i]==t[j])

{

i++;

j++;

}

else

{

GetNext(t,next);

j=next[j];

{

if(j==0)

{

i++;

j++;

}

}

}

}

if(j>h)

printf("匹配的起始下表为:%d\n",i-j+1);

else

printf("匹配失败\n");

}

执行结果见下面的截图:

第二节:KMP算法改进及其程序实现

根据上一节的学习,我们知道KMP算法是在一直串模式的next函数值的基础上执行的,那么如何求得模式串的next函数值呢?

首先我们来了解下next数组的含义:令原始串为: S[i],其中0<=i<=n;模式串为: T[j],其中0<=j<=m。假设目前匹配到如下位置S0,S1,S2,...,Si-j,Si-j+1......,Si-1,Si,Si+1,....,Sn

T0,T1,...........,Tj-1,Tj, .....

S和T的红色部分匹配成功,恰好到Si和Tj的时候失配(粉红色),如果要保持i不变,同时达到让模式串T相对于原始串S右移的话,可以更新j的值,让Si和新的Tj进行匹配,假设新的j用next[j]表示,即让Si和next[j]匹配,显然新的j值要小于之前的j值,模式串才会是右移的效果,也就是说应该有next[j] <= j -1。那新的j值也就是next[j]应该是多少呢?

我们观察如下的匹配:(1).如果模式串右移1位,即next[j] = j - 1,即让绿色的Si和Tj-1匹配(注:省略号为未匹配部分)

S0,S1,S2,...,Si-j,Si-j+1.......,Si-1,Si, Si+1,....,Sn

T0,T1,...............,..Tj-1, Tj, ...

(T的划线部分和S划线部分相等<1>)

T0,T1,................Tj-2,Tj-1,...

(移动后的T的划线部分和S的划线部分相等<2>)

根据<1><2>可以知道当next[j] =j -1,即模式串右移一位的时候,有T[0 ~ j-2] == T[1 ~ j-1]。而这两部分恰好是字符串T[0 ~j-1]的前缀和后缀,也就是说next[j]的值取决于模式串T中j前面部分的前缀和后缀相等部分的长度。

(2).如果模式串右移2位,即next[j] = j - 2,即让绿色的Si和Tj-2匹配

S0,S1,...,Si-j,Si-j+1,Si-j+2............,Si-1, Si, Si+1,....,Sn T0,T1,T2,...................,Tj-1, Tj, ..........

(T的划线部分和S划线部分相等<3>)

T0,T1,.............,Tj-3,Tj-2,..............

(移动后的T的划线部分和S的划线部分相等<4>)

同样根据<3><4>可以知道当next[j] =j -2,即模式串右移两位的时候,有T[0 ~ j-3] == T[2 ~ j-1]。而这两部分也恰好是字符串T[0 ~j-1]的前缀和后缀,也就是说next[j]的值取决于模式串T中j前面部分的前缀和后缀相等部分的长度。

(3).依次类推,可以得到如下结论当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度,并且恰好next[j]等于这个最大长度。

因而我们进而得到求出该数组的算法为:

void get_nextval(SString T ,int nextval[] ){

//将模式串T的next函数值并存入数组nextval中

int i= 1;

nextval[1]= 0;

j= 0;

while(i

if(j==0||T[i]==T[j])

{ ++i; ++j;

If(T[i]!=T[j]) nextval[i]=j;

else nextval[i]= nextval[j];

}

else j=nextval[j];

}//get_nextval

进而我们得到KMP算法的匹配函数如下:

Char *kmpMatch(char *t, char *s, int next[])

{ int k, j;

k = j = 0;

while(s[j] != '\0' && t[k] != '\0')

if (s[j] == t[k]){ k++; j++; }

else if(j == 0)k++;

else j = next[j-1]+1;

if (s[j] == '\0') return t + k - j;

return NULL;

}

我们研究的目的是经过对KMP算法的改进可以实现对主字符串中的所有字串出现的匹配点都找出来,并且统计其各自的匹配的起始下标。具体的改进后的KMP算法C语言实现的源代码如下:假设又两个随机的字符串S和T,例如主串S=acdfgawedgawekmagawekacdgege gawekbmahbn和子串T=gawek;

#include

#include

#include

#define N 50

void faillink(char *t, int *flink)

{

int j, k = -1;

int lent = strlen(t);

flink[0] = -1;

for (j=0; j

{

while ((k!=-1) && (t[j]!=t[k]))

{

k = flink[k];

}

flink[j+1] = k+1;

k++;

}

}

int index(char *s, char *t, int *p)

{

int i, j = 0, tot = 0;

int *flink = new int[strlen(t)];

faillink(t, flink);

int lens = strlen(s);

int lent = strlen(t);

for (i=0; i

{

while ((j!=-1) && (s[i]!=t[j]))

{

j = flink[j];

}

j++;

i++;

if (j==lent)

{

p[tot] = i-j;

tot++;

i--;

j--;

j = flink[j];

}

}

delete[] flink;

return(tot);

}

int main()

{

printf("姓名李春豹学号200713140114\n");

char a[N],b[N];

int next[N]={0};

printf("请输入主串a:\n");

gets(a);

printf("请输入模式串b:\n");

gets(b);

int p[50];

int tot;

tot = index(a, b, p);

cout<<"主串:"<

cout<<"子串:"<

{

cout<<"匹配位置:";

for(int i=0; i

{

cout<

}

cout<

}

cout<

return(0);

}

执行结果见下面的截图:

通过以上改进使我们的KMP算法的功能更复杂更强大,能够在一个字符串中轻易的找到你想查找的字符串,更方便、更实用。例如给我一个主串和其他多字符串,问哪些字符串是这个主串的子串,这些问题在以后的软件开发中用到的话就可以直接拿去用,实在是很方便。因为我想windows中的搜索引擎的查找功能是不是也运用了这种算法呢,只要输入某篇文章中的几个关键字,就能很快的搜索出它是什么文章,这不是和我们的简单的字符串查找很相似嘛。

第四章:总结与展望

第一节:总结

KMP算法,即Knuth-Morris-Pratt算法,是一种典型的基于前缀的搜索的字符串匹配算法。KMP算法的搜索思路应该算是比较简单的:模式和文件进行前缀匹配,一旦发现不匹配的现象,则通过一个精心构造的数组索引模式向前滑动的距离。这个算法相对于常规的逐个字符匹配的方法的优越之处在于,它可以通过数组索引,减少匹配的次数,从而提高运行效率。

掌握了KMP算法就明白了各个搜索引擎工作的工作原理,都是通过字符串匹配来实现迅速查找的,迅速、准确。

我不会忘记这难忘的几个月的时间。毕业论文的制作给了我难忘的回忆。在我徜徉书海查找资料的日子里,面对无数书本的罗列,最难忘的是每次找到资料时的激动和兴奋在整个过程中,我学到了新知识,增长了见识。在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。

脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神是我在这次设计中最大的收益。我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。

第二节:展望

字符串匹配算法在网络安全,网络信息检索和生物计算等领域中的应用十分的广泛和普遍,而且是至关重要不可或缺的,在未来的世界里她的作用会越来越大,而且人们会不断的改进她的算法执行思想和实现方法,以达到更高效、更灵敏、更迅速的目的,最大限度的造福人类。

在我们的生活中就有无数的字符串匹配方面的应用,电话信号的接收,windows系统中的查找功能,搜索引擎等等,都是她的应用范围。在查找打击各种黄色网站和暴力网站的查封都需要用到字符串匹配的技术。

在以后的生活中字符串的应用范围会更加广泛,在世界的任何一个角落,任

何一个时候我们都会用到匹配的技术,将与人们的生活息息相关。

参考文献:

[1]严蔚敏,吴伟民.数据结构 (C语言版 ) [M].北京:清华大学出版社,2008.9

[2]刘燕兵.串匹配算法优化的研究.中国科学院硕士学位论文-中国科学院计算技术研究所,2006.6

[3]潘金贵,顾铁成.算法导论.[M].机械工业出版社,2010.9

[4]吴哲辉,曹立明,蒋昌俊.算法分析与设计[M].北京:煤炭工业出版社,2006.6

致谢

时光匆匆如流水,转眼便是大学毕业时节,春梦秋云,聚散真的好快啊。离校的日期已经日益临近了,毕业论文的完成也随之进入尾声。从开始进入课题到论文的顺利完成一直都离不开老师、同学、朋友给我的热情帮助和耐心的教导,在这里请接受我最诚挚的谢意。

本学位论文的撰写都是由滕云老师的亲切关怀和悉心指导下完成的。从课题的选择到论文的最终完成,滕老师都给了我细心的指导和不懈的支持,并且耐心指导论文之余还不忘拓宽我们的文化视野,让我对现在非常热门的云技术有所了解。滕老师宅心仁厚,闲静少言,不慕荣利,对学生认真负责,在他身上,我们可以感受到一个学者的严谨和务实,这些都让我们获益匪浅,并且将终生受用无穷。毕竟“经师易得,人师难求”,希望借此机会向滕老师表示最衷心的感谢!

此外,本文得以顺利完成,也是得到了计算机学院的其它老师的帮助,他们在我论文撰写的过程中给予了我很多的指导,再次同样感谢他们。

最后要感谢的我的父母,他们不辞辛苦供我读书,让我在漫漫的人生旅途中有了更多的良师益友和更深层的知识积累。在未来的日子里,我会更加努力的学习和工作,不辜负父母对我的殷殷希望!我一定会好好孝敬和报答他们的。

Halcon中模板匹配方法的总结归纳

Halcon中模板匹配方法的总结归纳 基于组件的模板匹配: 应用场合:组件匹配是形状匹配的扩展,但不支持大小缩放匹配,一般用于多个对象(工件)定位的场合。 算法步骤: 1.获取组件模型里的初始控件gen_initial_components() 参数: ModelImage [Input] 初始组件的图片 InitialComponents [Output] 初始组件的轮廓区域 ContrastLow [Input] 对比度下限 ContrastHigh [Input] 对比度上限 MinSize [Input] 初始组件的最小尺寸 Mode[Input] 自动分段的类型 GenericName [Input] 可选控制参数的名称 GenericValue [Input] 可选控制参数的值 2.根据图像模型,初始组件,训练图片来训练组件和组件相互关系train_model_components() 3.创建组件模型create_trained_component_model() 4.寻找组件模型find_component_model() 5.释放组件模型clear_component_model() 基于形状的模板匹配: 应用场合:定位对象内部的灰度值可以有变化,但对象轮廓一定要清晰平滑。 1.创建形状模型:create_shape_model() 2.寻找形状模型:find_shpae_model() 3.释放形状模型:clear_shape_model() 基于灰度的模板匹配: 应用场合:定位对象内部的灰度值没有大的变化,没有缺失部分,没有干扰图像和噪声的场合。 1.创建模板:create_template() 2.寻找模板:best_match() 3.释放模板:clear_template() 基于互相关匹配: 应用场合:搜索对象有轻微的变形,大量的纹理,图像模糊等场合,速度快,精度低。 1.创建模板:create_ncc_model() 2.寻找模板:find_ncc_model() 3.释放模板:clear_ncc_model() 基于变形匹配: 应用场合:搜索对象有轻微的变形。 1.创建模板:create_local_deformable_model() 2.寻找模板:find_local_deformable_model() 3.释放模板:clear_deformable_model()

字符串的模式匹配算法

在前面的图文中,我们讲了“串”这种数据结构,其中有求“子串在主串中的位置”(字符串的模式匹配)这样的算法。解决这类问题,通常我们的方法是枚举从A串(主串)的什么位置起开始与B串(子串)匹配,然后验证是否匹配。假设A串长度为n,B串长度为m,那么这种方法的复杂度是O(m*n)的。虽然很多时候复杂度达不到m*n(验证时只看头一两个字母就发现不匹配了),但是我们有许多“最坏情况”,比如: A=“aaaaaaaaaaaaaaaaaaaaaaaaab”,B=“aaaaaaaab”。 大家可以忍受朴素模式匹配算法(前缀暴力匹配算法)的低效吗?也许可以,也许无所谓。 有三位前辈D.E.Knuth、J.H.Morris、V.R.Pratt发表一个模式匹配算法,最坏情况下是O(m+n),可以大大避免重复遍历的情况,我们把它称之为克努特-莫里斯-普拉特算法,简称KMP算法。 假如,A=“abababaababacb”,B=“ababacb”,我们来看看KMP是怎样工作的。我们用两个指针i和j分别表示,。也就是说,i是不断增加的,随着i 的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前j个字符(j当然越大越好),现在需要检验A[i+1]和B[j+1]的关系。 例子: S=“abcdefgab” T=“abcdex” 对于要匹配的子串T来说,“abcdex”首字符“a”与后面的串“bcdex”中任意一个字符都不相等。也就是说,既然“a”不与自己后面的子串中任何一字符相等,那么对于主串S来说,前5位字符分别相等,意味着子串T的首字符“a”不可能与S串的第2到第5位的字符相等。朴素算法步骤2,3,4,5的判断都是多余,下次的起始位置就是第6个字符。 例子: S=“abcabcabc” T=“abcabx”

模式匹配的KMP算法详解

模式匹配的KMP算法详解 模式匹配的KMP算法详解 这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KMP算法。大概学过信息学的都知道,是个比较难理解的算法,今天特把它搞个彻彻底底明明白白。 注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法: int Index(String S,String T,int pos)//参考《数据结构》中的程序 { i=pos;j=1;//这里的串的第1个元素下标是1 while(i<=S.Length && j<=T.Length) { if(S[i]==T[j]){++i;++j;} else{i=i-j+2;j=1;}//**************(1) } if(j>T.Length) return i-T.Length;//匹配成功 else return 0; } 匹配的过程非常清晰,关键是当‘失配’的时候程序是如何处理的?回溯,没错,注意到(1)句,为什么要回溯,看下面的例子: S:aaaaabababcaaa T:ababc aaaaabababcaaa ababc.(.表示前一个已经失配) 回溯的结果就是 aaaaabababcaaa a.(babc) 如果不回溯就是 aaaaabababcaaa aba.bc 这样就漏了一个可能匹配成功的情况 aaaaabababcaaa ababc 为什么会发生这样的情况?这是由T串本身的性质决定的,是因为T串本身有前后'部分匹配'的性质。如果T为abcdef这样的,大没有回溯的必要。

图像分割算法的研究与实现本科学士学位毕业论文

TP391.41 学士学位论文(设计) 论文题目图像分割算法研究与实现 作者姓名 指导教师 所在院系 专业名称 完成时间

毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。 作者签名:日期: 指导教师签名:日期: 使用授权说明 本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名:日期:

学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。 作者签名:日期:年月日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 涉密论文按学校规定处理。 作者签名:日期:年月日 导师签名:日期:年月日

基于特征的图像匹配算法毕业设计论文(含源代码)

诚信声明 本人声明: 我所呈交的本科毕业设计论文是本人在导师指导下进行的研究工作及取得的研究成果。尽我所知,除了文中特别加以标注和致谢中所罗列的内容以外,论文中不包含其他人已经发表或撰写过的研究成果。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示了谢意。本人完全意识到本声明的法律结果由本人承担。 申请学位论文与资料若有不实之处,本人承担一切相关责任。 本人签名:日期:2010 年05 月20日

毕业设计(论文)任务书 设计(论文)题目: 学院:专业:班级: 学生指导教师(含职称):专业负责人: 1.设计(论文)的主要任务及目标 (1) 了解图象匹配技术的发展和应用情况,尤其是基于特征的图象匹配技术的发展和应用。 (2) 学习并掌握图像匹配方法,按要求完成算法 2.设计(论文)的基本要求和内容 (1)查阅相关中、英文文献,完成5000汉字的与设计内容有关的英文资料的翻译。(2)查阅15篇以上参考文献,其中至少5篇为外文文献,对目前国内外图象匹配技术的发展和应用进行全面综述。 (3)学习图象匹配算法,尤其是基于特征的图象匹配算法。 (4)实现并分析至少两种基于特征的图象匹配算法,并分析算法性能。 3.主要参考文献 [1]谭磊, 张桦, 薛彦斌.一种基于特征点的图像匹配算法[J].天津理工大学报,2006, 22(6),66-69. [2]甘进,王晓丹,权文.基于特征点的快速匹配算法[J].电光与控制,2009,16(2), 65-66. [3]王军,张明柱.图像匹配算法的研究进展[J].大气与环境光学学报,2007,2(1), 12-15.

基于HALCON的模板匹配方法总结--蓝云杨的机器视觉之路

基于HALCON的模板匹配方法总结--蓝云杨的机器视觉之路 蓝云杨的机器视觉之路https://www.sodocs.net/doc/766312826.html,/blog/user1/8/index.html 首页相册 标签机器视觉(64)图像处理(11)视频压缩(12)小波分析(5)三峡(3)生活随笔(32)HALCON(7)编程感悟(18)哲思慧语(32) 基于HALCON的模板匹配方法总结 2006-8-16 16:34:00 4 推荐很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间。去年有过一段时间的集中学习,做了许多的练习和实验,并对基于HDevelop 的形状匹配算法的参数优化进行了研究,写了一篇《基于HDevelop的形状匹配算法参数的优化研究》文章,总结了在形状匹配过程中哪些参数影响到模板的搜索和匹配,又如何来协调这些参数来加快匹配过程,提高匹配的精度,这篇paper放到了中国论文在线了,需要可以去下载。 德国MVTec公司开发的HALCON机器视觉开发软件,提供了许多的功能,在这里我主要学习和研究了其中的形状匹配的算法和流程。HDevelop开发环境中提供的匹配的方法主要有三种,即Component-Based、Gray-Value-Based、Shape-Based,分别是基于组件(或成分、元素)的匹配,基于灰度值的匹配和基于形状的匹配。这三种匹配的方法各具特点,分别适用于不同的图像特征,但都有创建模板和寻找模板的相同过程。这三种方法里面,我主要就第三种-基于形状的匹配,做了许多的实验,因此也做了基于形状匹配的物体识别,基于形状匹配的视频对象分割和基于形状匹配的视频对象跟踪这些研究,从中取得较好的效果,简化了用其他工具,比如VC++来开发的过程。在VC下往往针对不同的图像格式,就会弄的很头疼,更不用说编写图像特征提取、模板建立和搜寻模板的代码呢,我想其中间过程会很复杂,效果也不一定会显著。下面我就具体地谈谈基于HALCON的形状匹配算法的研究和心得总结。 1. Shape-Based matching的基本流程 HALCON提供的基于形状匹配的算法主要是针对感兴趣的小区域来建立模板,对整个图像建立模板也可以,但这样除非是对象在整个图像中所占比例很大,比如像视频会议中人体上半身这样的图像,我在后面的视频对象跟踪实验中就是针对整个图像的,这往往也是要牺牲匹配速度的,这个后面再讲。基本流程是这样的,如下所示: ⑴ 首先确定出ROI的矩形区域,这里只需要确定矩形的左上点和右下点的坐标即可,gen_rectangle1()这个函数就会帮助你生成一个矩形,利用area_center()找到这个矩形的中心; ⑵ 然后需要从图像中获取这个矩形区域的图像,reduce_domain()会得到这个ROI;这之后就可以对这个矩形建立模板,而在建立模板之前,可以先对这个区域进行一些处理,方便以后的建模,比如阈值分割,数学形态学的一些处理等等; ⑶ 接下来就可以利用create_shape_model()来创建模板了,这个函数有许多参数,其中金字塔的级数由Numlevels指定,值越大则找到物体的时间越少,AngleStart 和AngleExtent决定可能的旋转范围,AngleStep指定角度范围搜索的步长;这里需要提醒的是,在任何情况下,模板应适合主内存,搜索时间会缩短。对特别大的模板,用Optimization

字符串匹配算法总结

Brute Force(BF或蛮力搜索) 算法: 这是世界上最简单的算法了。 首先将匹配串和模式串左对齐,然后从左向右一个一个进行比较,如果不成功则模式串向右移动一个单位。 速度最慢。 那么,怎么改进呢? 我们注意到Brute Force 算法是每次移动一个单位,一个一个单位移动显然太慢,是不是可以找到一些办法,让每次能够让模式串多移动一些位置呢? 当然是可以的。 我们也注意到,Brute Force 是很不intelligent 的,每次匹配不成功的时候,前面匹配成功的信息都被当作废物丢弃了,当然,就如现在的变废为宝一样,我们也同样可以将前面匹配成功的信息利用起来,极大地减少计算机的处理时间,节省成本。^_^ 注意,蛮力搜索算法虽然速度慢,但其很通用,文章最后会有一些更多的关于蛮力搜索的信息。 KMP算法 首先介绍的就是KMP 算法。 这个算法实在是太有名了,大学上的算法课程除了最笨的Brute Force 算法,然后就介绍了KMP 算法。也难怪,呵呵。谁让Knuth D.E. 这么world famous 呢,不仅拿了图灵奖,而且还写出了计算机界的Bible (业内人士一般简称TAOCP). 稍稍提一下,有个叫H.A.Simon的家伙,不仅拿了Turing Award ,顺手拿了个Nobel Economics Award ,做了AI 的爸爸,还是Chicago Univ的Politics PhD ,可谓全才。 KMP 的思想是这样的: 利用不匹配字符的前面那一段字符的最长前后缀来尽可能地跳过最大的距离 比如 模式串ababac这个时候我们发现在c 处不匹配,然后我们看c 前面那串字符串的最大相等前后缀,然后再来移动 下面的两个都是模式串,没有写出来匹配串 原始位置ababa c 移动之后aba bac 因为后缀是已经匹配了的,而前缀和后缀是相等的,所以直接把前缀移动到原来后缀处,再从原来的c 处,也就是现在的第二个b 处进行比较。这就是KMP 。 Horspool算法。 当然,有市场就有竞争,字符串匹配这么大一个市场,不可能让BF 和KMP 全部占了,于是又出现了几个强劲的对手。

实验三____串的模式匹配

实验三串的模式匹配 一、实验目的 1.利用顺序结构存储串,并实现串的匹配算法。 2.掌握简单模式匹配思想,熟悉KMP算法。 二、实验要求 1.认真理解简单模式匹配思想,高效实现简单模式匹配; 2.结合参考程序调试KMP算法,努力算法思想; 3.保存程序的运行结果,并结合程序进行分析。 三、实验内容 1、通过键盘初始化目标串和模式串,通过简单模式匹配算法实现串的模式匹配,匹配成功后要求输出模式串在目标串中的位置; 2、参考程序给出了两种不同形式的next数组的计算方法,请完善程序从键盘初始化一目标串并设计匹配算法完整调试KMP算法,并与简单模式匹配算法进行比较。 参考程序: #include "stdio.h" void GetNext1(char *t,int next[])/*求模式t的next值并寸入next数组中*/ { int i=1,j=0; next[1]=0; while(i<=9)//t[0] { if(j==0||t[i]==t[j]) {++i; ++j; next[i]=j; } else j=next[j]; } } void GetNext2(char *t , int next[])/* 求模式t 的next值并放入数组next中 */ { int i=1, j = 0; next[1]= 0; /* 初始化 */ while (i<=9) /* 计算next[i+1] t[0]*/ { while (j>=1 && t[i] != t[j] ) j = next[j]; i++; j++;

if(t[i]==t[j]) next[i] = next[j]; else next[i] = j; } } void main() { char *p="abcaababc"; int i,str[10]; GetNext1(p,str); printf("\n"); for(i=1;i<10;i++) printf("%d",str[i]); GetNext2(p,str); printf("\n"); for(i=1;i<10;i++) printf("%d",str[i]); printf("\n\n"); }

基於HALCON的模板匹配方法总结

基於HALCON的模板匹配方法總結 基於HALCON的模板匹配方法總結 很早就想總結一下前段時間學習HALCON的心得,但由於其他的事情總是抽不出時間。去年有過一段時間的集中學習,做了許多的練習和實驗,並對基於HDevelop的形狀匹配算法的參數優化進行了研究,寫了一篇《基於HDevelop的形狀匹配算法參數的優化研究》文章,總結了在形狀匹配過程中哪些參數影響到模板的搜索和匹配,又如何來協調這些參數來加快匹配過程,提高匹配的精度,這篇paper放到了中國論文在線了,需要可以去下載。 德國MVTec公司開發的HALCON機器視覺開發軟件,提供了許多的功能,在這裡我主要學習和研究了其中的形狀匹配的算法和流程。HDevelop開發環境中提供的匹配的方法主要有三種,即Component-Based、Gray-Value-Based、Shape-Based,分別是基於組件(或成分、元素)的匹配,基於灰度值的匹配和基於形狀的匹配。這三種匹配的方法各具特點,分別適用於不同的圖像特征,但都有創建模板和尋找模板的相同過程。這三種方法裡面,我主要就第三種-基於形狀的匹配,做了許多的實驗,因此也做了基於形狀匹配的物體識別,基於形狀匹配的視頻對象分割和基於形狀匹配的視頻對象跟蹤這些研究,從中取得較好的效果,簡化了用其他工具,比如VC++來開發的過程。在VC下往往針對不同的圖像格式,就會弄的很頭疼,更不用說編寫圖像特征提取、模板建立和搜尋模板的代碼呢,我想其中間過程會很復雜,效果也不一定會顯著。下面我就具體地談談基於HALCON的形狀匹配算法的研究和心得總結。 1. Shape-Based matching的基本流程 HALCON提供的基於形狀匹配的算法主要是針對感興趣的小區域來建立模板,對整個圖像建立模板也可以,但這樣除非是對象在整個圖像中所佔比例很大,比如像視頻會議中人體上半身這樣的圖像,我在後面的視頻對象跟蹤實驗中就是針對整個圖像的,這往往也是要犧牲匹配速度的,這個後面再講。基本流程是這樣的,如下所示: ⑴首先確定出ROI的矩形區域,這裡只需要確定矩形的左上點和右下點的坐標即可, gen_rectangle1()這個函數就會幫助你生成一個矩形,利用area_center()找到這個矩形的中心; ⑵然後需要從圖像中獲取這個矩形區域的圖像,reduce_domain()會得到這個ROI;這之後就可以對這個矩形建立模板,而在建立模板之前,可以先對這個區域進行一些處理,方便以後的建模,比如閾值分割,數學形態學的一些處理等等; ⑶接下來就可以利用create_shape_model()來創建模板了,這個函數有許多參數,其中金字塔的級數由Numlevels指定,值越大則找到物體的時間越少,AngleStart和AngleExtent 決定可能的旋轉范圍,AngleStep指定角度范圍搜索的步長;這裡需要提醒的是,在任何情

MySQL中的字符串模式匹配.

MySQL中的字符串模式匹配 本文关键字:MySQL 字符串模式匹配 MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi、grep 和sed的扩展正则表达式模式匹配的格式。 标准的SQL模式匹配 SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL中,SQL的模式缺省是忽略大小写的。下面显示一些例子。注意在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比较操作符。 例如,在表pet中,为了找出以“b”开头的名字: +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+ 为了找出以“fy”结尾的名字:

+--------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+-------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+------+------------+-------+ 为了找出包含一个“w”的名字: +----------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+

串的模式匹配算法实验报告

竭诚为您提供优质文档/双击可除串的模式匹配算法实验报告 篇一:串的模式匹配算法 串的匹配算法——bruteForce(bF)算法 匹配模式的定义 设有主串s和子串T,子串T的定位就是要在主串s中找到一个与子串T相等的子串。通常把主串s称为目标串,把子串T称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串s中找到一个模式串T;不成功则指目标串s中不存在模式串T。bF算法 brute-Force算法简称为bF算法,其基本思路是:从目标串s的第一个字符开始和模式串T中的第一个字符比较,若相等,则继续逐个比较后续的字符;否则从目标串s的第二个字符开始重新与模式串T的第一个字符进行比较。以此类推,若从模式串T的第i个字符开始,每个字符依次和目标串s中的对应字符相等,则匹配成功,该算法返回i;否则,匹配失败,算法返回0。 实现代码如下:

/*返回子串T在主串s中第pos个字符之后的位置。若不存在,则函数返回值为0./*T非空。 intindex(strings,stringT,intpos) { inti=pos;//用于主串s中当前位置下标,若pos不为1则从pos位置开始匹配intj=1;//j用于子串T中当前位置下标值while(i j=1; } if(j>T[0]) returni-T[0]; else return0; } } bF算法的时间复杂度 若n为主串长度,m为子串长度则 最好的情况是:一配就中,只比较了m次。 最坏的情况是:主串前面n-m个位置都部分匹配到子串的最后一位,即这n-m位比较了m次,最后m位也各比较了一次,还要加上m,所以总次数为:(n-m)*m+m=(n-m+1)*m从最好到最坏情况统计总的比较次数,然后取平均,得到一般情况是o(n+m).

(完整版)图像分割算法的研究与实现_本科毕业设计

数字图像处理期末考试 题目图像分割算法研究与实现专业班级11通信工程一班

毕业论文(设计)诚信声明 本人声明:所呈交的毕业论文(设计)是在导师指导下进行的研究工作及取得的研究成果,论文中引用他人的文献、数据、图表、资料均已作明确标注,论文中的结论和成果为本人独立完成,真实可靠,不包含他人成果及已获得青岛农业大学或其他教育机构的学位或证书使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示了谢意。 论文(设计)作者签名:日期:2013 年3月10 日 毕业论文(设计)版权使用授权书 本毕业论文(设计)作者同意学校保留并向国家有关部门

或机构送交论文(设计)的复印件和电子版,允许论文(设计)被查阅和借阅。本人授权青岛农业大学可以将本毕业论文(设计)全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本毕业论文(设计)。本人离校后发表或使用该毕业论文(设计)或与该论文(设计)直接相关的学术论文或成果时,单位署名为青岛农业大学。 论文(设计)作者签名:日期:2013 年 3 月10 日 指导教师签名:日期:年月日

目录 摘要: (1) 1.前言 (2) 2.图像分割概念 (3) 2.1图像分割定义 (3) 2.2图像分割方法综述 (4) 2.3阈值法 (5) 2.4 基于边缘检测的分割方法 (9) 2.5基于区域的分割方法 (12) 3.图像分割方法详述 (14) 3.1图像分割方法 (14) 3.2 图像分割方法实现 (14) 4.实验结果及分析 (16) 4.1 实验结果 (16) 4.2 实验结果分析 (20) 5.小结 (23) 5.1 主要工作总结 (23) 5.2 结论 (23) 6.附录 (27)

KMP字符串模式匹配算法解释

个人觉得这篇文章是网上的介绍有关KMP算法更让人容易理解的文章了,确实说得很“详细”,耐心地把它看完肯定会有所收获的~~,另外有关模式函数值next[i]确实有很多版本啊,在另外一些面向对象的算法描述书中也有失效函数f(j)的说法,其实是一个意思,即next[j]=f(j-1)+1,不过还是next[j]这种表示法好理解啊: KMP字符串模式匹配详解 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。 一.简单匹配算法 先来看一个简单匹配算法的函数: int Index_BF ( char S [ ], char T [ ], int pos ) { /* 若串S 中从第pos(S 的下标0≤pos

基于HALCON的模板匹配方法总结.

基于HALCON的模板匹配方法总结 基于HALCON的模板匹配方法总结 HDevelop开发环境中提供的匹配的方法主要有三种,即Component-Based、Gray-Value-Based、Shape-Based,分别是基于组件(或成分、元素)的匹配,基于灰度值的匹配和基于形状的匹配。这三种匹配的方法各具特点,分别适用于不同的图像特征,但都有创建模板和寻找模板的相同过程。这三种方法里面,我主要就第三种-基于形状的匹配,做了许多的实验,因此也做了基于形状匹配的物体识别,基于形状匹配的视频对象分割和基于形状匹配的视频对象跟踪这些研究,从中取得较好的效果。在VC下往往针对不同的图像格式,就会弄的很头疼,更不用说编写图像特征提取、模板建立和搜寻模板的代码呢,我想其中间过程会很复杂,效果也不一定会显著。下面我就具体地谈谈基于HALCON的形状匹配算法的研究和心得总结。 1. Shape-Based matching的基本流程 HALCON提供的基于形状匹配的算法主要是针对感兴趣的小区域来建立模板,对整个图像建立模板也可以,但这样除非是对象在整个图像中所占比例很大,比如像视频会议中人体上半身这样的图像,我在后面的视频对象跟踪实验中就是针对整个图像的,这往往也是要牺牲匹配速度的,这个后面再讲。基本流程是这样的,如下所示: ⑴ 首先确定出ROI的矩形区域,这里只需要确定矩形的左上点和右下点的坐标即可,gen_rectangle1()这个函数就会帮助你生成一个矩形,利用 area_center()找到这个矩形的中心;

⑵ 然后需要从图像中获取这个矩形区域的图像,reduce_domain()会得到这个ROI;这之后就可以对这个矩形建立模板,而在建立模板之前,可以先对这个区域进行一些处理,方便以后的建模,比如阈值分割,数学形态学的一些处理等等; ⑶ 接下来就可以利用create_shape_model()来创建模板了,这个函数有许多参数,其中金字塔的级数由Numlevels指定,值越大则找到物体的时间越少,AngleStart和AngleExtent决定可能的旋转范围,AngleStep指定角度范围搜索的步长;这里需要提醒的是,在任何情况下,模板应适合主内存,搜索时间会缩短。对特别大的模板,用Optimization来减少模板点的数量是很有用的;MinConstrast将模板从图像的噪声中分离出来,如果灰度值的波动范围是10,则MinConstrast应当设为10;Metric参数决定模板识别的条件,如果设为’use_polarity’,则图像中的物体和模板必须有相同的对比度;创建好模板后,这时还需要监视模板,用inspect_shape_model()来完成,它检查参数的适用性,还能帮助找到合适的参数;另外,还需要获得这个模板的轮廓,用于后面的匹配,get_shape_model_contours()则会很容易的帮我们找到模板的轮廓; ⑷ 创建好模板后,就可以打开另一幅图像,来进行模板匹配了。这个过程也就是在新图像中寻找与模板匹配的图像部分,这部分的工作就由函数 find_shape_model()来承担了,它也拥有许多的参数,这些参数都影响着寻找模板的速度和精度。这个的功能就是在一幅图中找出最佳匹配的模板,返回一个模板实例的长、宽和旋转角度。其中参数SubPixel决定是否精确到亚像素级,设为’interpolation’,则会精确到,这个模式不会占用太多时间,若需要更精确,则可设为’least_square’,’lease_square_high’,但这样会增加额外的时间,因此,这需要在时间和精度上作个折中,需要和实际联系起来。比较重要的两个参数是MinSocre和Greediness,前一个用来分析模板的旋转对称和它们之间的相似度,值越大,则越相似,后一个是搜索贪婪度,这个值在很大程度上影响着搜索速度,若为0,则为启发式搜索,很耗时,若为1,则为不安全搜索,但最快。在大多数情况下,在能够匹配的情况下,尽可能的增大其值。 ⑸ 找到之后,还需要对其进行转化,使之能够显示,这两个函数 vector_angle_to_rigid()和affine_trans_contour_xld()在这里就起这个作用。前一个是从一个点和角度计算一个刚体仿射变换,这个函数从匹配函数的

(完整版)LDPC码的编译码算法研究本科毕业设计

毕业论文题目:LDPC码的编译码算法研究

摘要 低密度奇偶校验码(Low Density Parity Check Codes,简称LDPC 码),本质上是一种线性分组码,更接近香农限。目前的研究均表明LDPC 码是信道编码中纠错能力最强的一种码,其译码器结构简单,在深空探测、卫星通信等领域可得到广泛的应用。文章介绍了LDPC 码,综述了其编码方法和译码方法。在编码方法中分别描述了校验矩阵的构造和基于校验矩阵的编码算法,对LDPC 码的快速编码方法进行分析。在译码方法中主要论述了消息传递译码算法、置信传播译码方法、最小和译码算法、比特翻转译码算法和加权比特翻转译码方法。对部分LDPC码的编译码就行了仿真,同时对LDPC 码的编译码方法的发展及应用前景作了分析。 本文的重点是对LDPC码的编译码算法的论述与研究,介绍LDPC码的基本原理和分类,分别从基于生成矩阵和基于校验矩阵详细讨论了LDPC码编码算法,简单介绍了线性分组码编码,LU分解法,RU分解法。并用简明例子对RU算法做了清晰的解释。对译码大致做了解释:分为软判决译码(MP算法)和硬判决译码(比特翻转算法和加权比特翻转算法)。在本文的最后用AWGN信道下LDPC码的性能仿真,主要是针对比特翻转算法进行仿真。做出理论比较。 关键词:LDPC码编译码MATLAB

Title:Encoding and Decoding Algorithms of LDPC Codes Abstract:LDPC code, namely Low Density Parity Check Code, is a kind of linear block codes in nature, and the decoding performance of LDPC is more nearer to the Shannon limit. With it s best performance and simple decoder structure, LDPC codes will be widely used in deep space exploration, salite communications and other fields. While briefly introducing LDPC codes are introduced briefly, this paper summarizes the encoding and decoding algorithms. The encoding algorithm is described in two steps: the const ruction of parity-check matrix and the encoding method based on parity-check matrix. Analyze the rapidly coding method for LDPC code. As to decoding algorithm, MP decoding method, BP decoding method, Min-Sum decoding method, Bit-Flipping method and Weighted Bit-Flipping method are discussed. Emulate for the LDPC codes .The development and application of encoding and decoding methods is analyzed as well. This article focuses on encoding and decoding algorithms of LDPC codes,According to the different methods of decoding algorithm, and makes the theoretical MATLAB simulation.

HALCON形状匹配总结

HALCON形状匹配总结 Halcon有三种模板匹配方法:即Component-Based、Gray-Value-Based、Shaped_based,分别是基于组件(或成分、元素)的匹配,基于灰度值的匹配和基于形状的匹配, 此外还有变形匹配和三维模型匹配也是分属于前面的大类 本文只对形状匹配做简要说明和补充: Shape_Based匹配方法: 上图介绍的是形状匹配做法的一般流程及模板制作的两种 方法。 先要补充点知识:形状匹配常见的有四种情况一般形状匹配模板shape_model、线性变形匹配模板 planar_deformable_model、局部可变形模板 local_deformable_model、和比例缩放模板Scale_model 第一种是不支持投影变形的模板匹配,但是速度是最高的, 第二种和第四种是支持投影变形的匹配,第三种则是支持局 部变形的匹配。 一般形状匹配模板是最常用的,模板的形状和大小一经制作 完毕便不再改变,在查找模板的过程中,只会改变模板的方 向和位置等来匹配目标图像中的图像。这个方法查找速度很 快,但是当目标图像中与模板对应的图像存在比例放大缩小

或是投影变形如倾斜等,均会影响查找结果。涉及到的算子 通常为create_shape_model 和find_shape_model 线性变形匹配模板planar_deformable_model是指模板在行列方向上可以进行适当的缩放。行列方向上可以分别独立的 进行一个适当的缩放变形来匹配。主要参数有行列方向查找 缩放比例、图像金字塔、行列方向匹配分数(指可接受的匹 配分数,大于这个值就接受,小于它就舍弃)、设置超找的角度、已经超找结果后得到的位置和匹配分数 线性变形匹配又分为两种:带标定的可变形模板匹配和不带 标定的可变形模板匹配。涉及到的算子有: 不带标定的模板:创建和查找模板算子 create_planar_uncalib_deformable_model和 find_planar_uncalib_deformable_model 带标定模板的匹配:先读入摄像机内参和外参 read_cam_par 和read_pose 创建和查找模板算子create_planar_calib_deformable_model和 find_planar_calib_deformable_model 局部变形模板是指在一张图上查找模板的时候,可以改变 模板的尺寸,来查找图像上具有局部变形的模板。例如包装 纸袋上图案查找。参数和线性变形额差不多 算子如下:create_local_deformable_model和 find_local_deformable_model

a算法演示系统设计大学本科毕业论文

摘要 本次课程设计的题目是“A星算法的演示系统”,A*算法在人工智能中是一种典型的启发式搜索算法,这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或在线游戏的BOT的移动计算上。本次课程设计要求能够演示出整个算法的执行过程,能够进行单步演示,动态演示,把算法的执行过程的精髓演示出来。 在对算法充分了解的基础上,演示算法的执行过程,就要涉及到图像的绘制,而对于图像的编程,显然高级语言有其开发效率高的特点,java强大的运算和图形展示功能,使图像编程变得更加的简单和直观。本课题基于eclipse的java集成开发环境,设计并实现了A星算法的演示系统,展示A星算法如何进行启发式搜索和寻路的过程。实现了设置起点、设置终点、设置障碍、清除障碍、直接寻路、单步寻路、动态寻路、重新寻路、添加默认障碍这些功能的操作。使用者能够通过自己的要求进行A星算法的演示和使用,本软件充分展示A星算法的执行过程。 关键字:A*算法,启发式搜索,java

Abstract The topic of the course design is"A star algorithm demo software", A * algorithm in artificial intelligence is A kind of typical heuristic search algorithm, this is A graphics in the plane ,have more than one node path, the algorithm of minimum through cost.it often be used in the game of mobile computing of NPC, or online games on mobile computing of BOT.The course design requirs to demonstrate the implementation process of the whole algorithm, can be single step demo, dynamic demonstration, the essence of the execution process of algorithm demo. on the basis of full understanding of the algorithm, Demonstrateing the algorithm implementation process will involve the Graph drawing, and the programming on image, obviously a high-level language has the characteristics of its development of high efficiency, Java powerful computing and graphics display function, make the image programming more simple and intuitive.This project is based on eclipse's Java integrated development environment, A star algorithm demo software was designed and implemented, showing how A star algorithm of heuristic search and pathfinding.Implements set the starting point and end point, barriers, clear obstacles, directly pathfinding, single step pathfinding, dynamic pathfinding, pathfinding again, add default barrier function of these operations.the user can use the software according to their requirments, the software fully shows the execution of A star algorithm. Keywords:AStar arithmetic ,heuristic search,java

相关主题