2011毕业论文-计算机应用基础

更新时间:2024-04-08 13:27:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

简单几何图形的识别和编辑

第一章 概述 ??????????????????????4 第(一)节 引言?????????????????? 4 犯得上法境???????????? 6

第(一)节 数字图像处理技术????????????? 6 1. 图像全 处理的基本内A ??????????????? 6

2. 主要的图像处理技术 ???????????????? 6 第(二)节 图像格式-BMP格式

?????????? 7

第三节 算法及数学基础????????????????? 8 1. 霍夫变换(Hough Transform)???????????? 8 2. 基于单义域的直线及圆识别算法??????????? 3. 主要技术?????????????????????

11 14

第三章 直线和圆的识别和编辑的实现??????????? 15 第(一)节 系统的层次结构的图示??????????? 15 第(二)节 系统数据结构及类的设计?????????? 16 1. 主要类的层次结构?????????????????? 16 2. 图形基类(CShape)???????????????? 17 3. 图形类(CLine、CCircle)?????????????

- 1 -

18

简单几何图形的识别和编辑

4. 图形容器类(CShapes)??????????????? 20 5. 点类(CPoint)??????????????????

21

6. 单义域类(CSegment)??????????????? 21 7. 基于单义域识别类(CSegments)??????????? 22 8. 霍夫变换识别直线类(CHTLine)??????????? 23 9. 霍夫变换识别圆类(CHTCircle)??????????? 23 第(三)节 系统功能介绍??????????????? 24 第四章 总结及展望??????????????????? 29 附录1:参考文献????????????????????30 附录2: 结束语???????????????????? 32

- 2 -

简单几何图形的识别和编辑

第一章 概述

第一节 引言

本论文实现的是基础的图形识别,bmp图像文件格式中对图形的矢量化。识别基本的图元直线和圆。直线和圆是二值图像中最基本的组成元素,也是最常见的图形元素。在工程图的数字化识别中有很大的应用。

关于理想情况的几点说明:

1. 所识别的bmp图像文件是经过处理的,没有“噪音”等,在本论文中

直接采用的是用Windows中的画图软件画出的图像。

2. 本论文中图像中的图元都是单一的线性,即线宽是一个象素的情况。

第二节 在工程图的识别中常用的方法

图形的识别最主要的是图形特征的提取,在这个阶段,常用的方法是全局特征方法(包括:不变距,自回归模型、傅立叶描述符、霍夫变换等),全局特征的特征提取方法是理论比较完善的,计算过程比较清楚。针对不同的特征提取处理,采用相对应的模式匹配方法来将图形分类,模式识别迄今已有很多方法,有模板匹配、统计模式识别、句法模式识别、模糊识别和神经网络识别等。

在二值图像的处理中,人们常用的数据结果有游程编码-考虑了扫描行上相邻象素间的相关性;行相邻图法(Line Adjeceney Gragh),是由Pavlidis提出的一种二值图的数据结构,LAG还考虑了相邻行黑游程之间的相邻关系,遍历时很方便;BAG(Bloek Adjeceney Gragh)是由余斌提出的,它是相邻图LAG在两个方向上的推广。在本论文中就是利用了LAG的数据结构思想与c++ builder的数据结构相结合的方法即:用下一个象素点是与链表头相邻还是和尾相邻来描述其相邻的关系。

本论文中对交点的处理。目前对交点的处理有下面几类算法: 1. 基于网格算法,该算法是通过网格加大搜索步长来跳过交点。

- 3 -

简单几何图形的识别和编辑

2. 基于图段合并的算法,是根据交点处行程段的连通性,以交点为界将图线分割成图段,记录各段之间的连接及从属关系,然后连接或延长各分支图段,然后得到整条图线。

在本论文中采用了第二种方法,基于图段合并的算法。

当然现下有很多更好的算法和数据结构,但是大部分是针对具体的结构或者研究方向不具有一般性,所以本论文的实现用了上述的数据结构和方法。

- 4 -

简单几何图形的识别和编辑

第二章 论文的工作基础和工作环境

第一节 数字图像处理技术

将客观世界实体或图片等通过不同的量化(数字化)手段送入计算机,由计算机按使用要求进行图像的平滑、增强、复原、分割、重建、编码、存储、传输等种种不同的处理,需要时把加工处理后的图像重新输出,这个过程称为图像处理。因此,图像处理的含义是用计算机对图像进行加工处理以得到某种预期的效果,它本质上是一种二维数字信号处理技术。

1. 图像处理的基本内容

图像处理的基本内容可以归结为:

1. 对图像进行增强或修改。

以改变或强调图像信息的某些特点(增强有用信息,无用信息),改善图像的视觉质量;

2. 描述图像的特征并进行特征抽取和分析。

例如提取图像的纹理特征、频谱特征、边界特征和颜色特征等;对像素用某个标准衡量并进行分类比较,将抽取的特征归结为一定的模式,这属于模式识别的范围;

3. 图像的重建(Reconstruction)。

对图像的某些部分合并或进行重新组织,这种技术是从N—1维的信息用某种算法得到N维的图像,例如计算机视觉就是这样的一种技术。

2. 主要的图像处理技术

2.1 图像的增强和恢复

图像增强所追求的目标是改善图像的视觉质量,符合人们的主观要求,它不追究图像客观质量的降低原因。图像的视觉质量是因人而异的,其质量

- 5 -

简单几何图形的识别和编辑

的高低和好坏受观看者的心理、爱好和文化素质等因素的影响。图像的恢复则致力于探索图像质量降低的原因,并尽可能消除图像质量的降低,恢复图像的本来面目。

2.2 图像的压缩编码

彩色数字图像通常是由三个二维数组组成的,其信息量相当大,这给图像的传输、处理、存储和显示等带来很大的负担。但问题的另一方面是图像中又往往存在很多冗余信息,在传输和存储时可以对数字图像进行一定方式的编码,删除图像中的冗余信息,以提高图像传输和存储的效率。

2.3 图像重建

在医学和工程应用中,利用超声波、x射线等技术取得物体的多幅来自不同角度的投影图,通过计算可得到物钵内部的图像,这种技术称为投影重建,例如CT就是图像重建的一个应用。

2.4 图像的分割和描述

计算机按照一定的客观测度(例如灰度、颜色和几何性质等)将图像中包含的物体和区域从图像中区分出来,称为图像的分割。用适当的数学语言来表示被分割出来的物体或区域的结构和统计特性,或用数学语言表示区域问的关系,称为描述。图像经分别和描述后,可较为容易地分类和识别。

第二节 图像格式-BMP格式

BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图像处理软件都支持BMP图像文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图像文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图像文件与显示设备无关,因此把这种BMP图像文件格式称为设备无关位图DIB(device-independent bitmap)格式,目的是为了让Windows能够在任何类型的显示设备上显示所存储的图像。BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。

- 6 -

简单几何图形的识别和编辑

? 文件结构

位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。

位图文件的组成 位图文件头 BITMAPFILEHEADER (bitmap-file header) 位图信息头 BITMAPINFOHEADER (bitmap-information header) 彩色表(color table) 图象数据阵列字节 RGBQUAD BYTE aColors[] aBitmapBits[] bmih bmfh 结构名称 符号

第三节 算法及数学基础

1. 霍夫变换(Hough Transform)

霍夫变换是图像处理中从图像中识别几何形状的基本方法之一。其基本思想就是把图像平面上的点对应到参数平面上的曲线,最后通过统计特性来解决问题。自1962年Hough公布了该算法以来,由于其良好的抗噪声性能和对部分遮盖的不敏感等特性,霍夫变换在模式识别领域得到广泛的应用,如直线、圆、椭圆、矩形等几何图形检测,任意形状区域的边界提取,二维或三维运动的参数估计等。

下面就于本论文相关的直线和圆的识别进行简单的介绍。

- 7 -

简单几何图形的识别和编辑

1.1 霍夫变换识别直线

霍夫变换识别直线,是将图像空间中的一点变换为参数空间中的一条直线。图像空间中同一直线上的点,经霍夫变换所形成的直线相交于参数空间中的一点,该点坐标代表图像空间中直线的斜率及截距。利用累加数组累计参数空间中通过该点的直线条数,即代表图像空间中直线上的点数。

图1.1 霍夫变换识别直线(1)

设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。我们知道,直线的方程可以用y?k?x?b来表示,其中k和b是参数,分别是斜率和截距。过某一点(x0,y0)的所有直线的参数都会满足方程y0?k?x0?b。即图像空间中的一点(x0,y0)确定了参数空间中的一族直线。方程y0?k?x0?b在参数k--b平面上是一条直线。这样,图像x--y平面上的一个前景像素点就对应到参数平面上的一条直线。

霍夫变换识别直线的算法描述如下:

Step1. 初始化一块缓冲区,对应于参数平面,将其所有数据置为0。 Step2. 对于图像上每一前景点,求出参数平面对应的直线,把这直线上的所有点的值都加1。

Step3. 找到参数平面上峰值点的位置,这些位置的坐标就是原图像上直线的参数,每个位置对应于原图像上的一条直线。

上面是霍夫变换识别直线的基本思想。在实际应用中,y?k?x?b形式的直线方程没有办法表示x=c形式的直线(这时候,直线的斜率为无穷大)。所以实际应用中,是采用参数方程:

??xcos??ysin?

这样,图像平面(x, y)空间上的一个点就对应到参数??空间中的一条正弦曲线上。在变换后的空间中这条正弦曲线上的任意一点对应于原始图像平面(x, y)空

- 8 -

简单几何图形的识别和编辑

间的一条直线,这条直线必通过(xi,yi)这个点,而(x, y)空间中所有共线的点经过变换后所对应的各正弦曲线都相交于一点。

图1.2 霍夫变换识别直线(2)

1.2 霍夫变换识别圆

1) 半径已知的圆的识别

利用霍夫变换检测出半径已知的圆形,是将图像平面上的每一点对应到参数平面上的一个以已知半径为半径的圆。经过霍夫变换,在参数平面上得到圆相交于一点,这个点的坐标即为原图形坐标平面上待识别的圆心坐标。

算法可以简单描述为:取和图像平面一样的参数平面,以图像上每一个前景点为圆心,以已知的半径在参数平面上画圆,并把结果进行累加。最后找出参数平面上的峰值点,这个位置就对应了图像上的圆心。

2) 未知半径的圆的识别

在第一个问题基础上,把参数平面扩大称为三维空间,即x--y--R三维,对应圆的圆心和半径。图像平面上的每一点就对应于参数空间中每个半径下的一个圆,在参数的三维空间中得到一个圆锥。最后找出参数空间中的峰值点,即得到待识别的圆的圆心和半径。

由于霍夫变换具有良好的抗噪声性能和对部分遮盖的不敏感等特性,又不受图像旋转的影响,在很多领域都有广泛的应用,有关霍夫变换的研究和改进也很多。例如广义霍夫变换、随机霍夫变换、快速霍夫变换等等,就是针对直线的霍夫变换也有很多改进算法。由于时间的原因,在本软件中,只是使用了标准的霍夫变换算法。

- 9 -

简单几何图形的识别和编辑

2. 基于单义域的直线及圆识别算法

霍夫变换为几何图形的识别的一个重要算法,但是由于该标准算法的时间复杂度和空间复杂度都是O(Nm),其中m是参数坐标的维数,虽然有不少针

对具体问题(例如直线识别)的改进算法,其在实际使用中也存在计算量大的问题。针对本论文的工作的实际情况,参考文献【1】,并进行了适当的简化,完成了论文的识别部分。下面就对这个基于单义域的识别算法进行简单的介绍。

2.1 多义域的获得

单义域是指对待识别的图形进行分割得到的具有单一的几何意义(线段或圆弧)点的集合。对图片进行从上往下、从左往右的扫描,根据交点进行分割得到多义域,多义域中的点构成一个连通区域。对多义域进行识别并分割得到单义域。

多义域由链表实现。 算法描述如下:

1. 对图形进行从上往下、从左往右的扫描; 2. 对每一个前景点,判断其是否为交点;

3. 将该点与现有的多义域的头(如果其头节点不是交点)、尾(如果其

尾节点不是交点)节点进行比较,如果与头节点相邻,将其插入到该多义域的头节点之前;如果与尾节点相邻,将其插入到该多义域的尾节点之后。

4. 如果该前景点不属于任何现有多义域,则以该点为头节点生成新的多

义域。

5. 直到图形扫描完毕。 注:交点的判断。

由此得到的多义域将是一个线段、一个圆弧或者线段和圆弧的组合。在后续的识别过程中将把不是单义域的进行分裂。

- 10 -

简单几何图形的识别和编辑

2.2 最小二乘法拟合直线和圆

最小二乘法首先由Karl Gauss为进行行星轨道预测的研究而提出的。现在最小二乘法已经变成从实验数据来进行参数估计的主要手段。由最小二乘法获得的估计在一定条件下有最佳的统计特性:一致、无偏、有效。它提供给我们一个数学程式,通过它能获得一个在最小方差意义上与实验数据最好拟合助模型。

运用最小二乘法进行圆的拟合公式如下:

其中,(xi,yi)为样点,(x0,y0)为所求圆心,差,

为最大径向误差。

为半径,为平均径向误

- 11 -

简单几何图形的识别和编辑

2.3 多义域分裂和单义域的识别

对2.1中得到的多义域,运用最小二乘法进行拟合,对于拟合不成功的多义域运用首尾相连最大距离法进行分裂,得到单义域,并记录下各单义域的拟合结果,供全局考虑,识别直线和圆用。

算法描述如下:

1. 从2.1得到的多义域列表里取第一个多义域;

2. 对选中的多义域运用最小二乘法进行圆的拟合;如果得到的平均径向误差和最大径向误差小于指定阈值,则认为拟合成功,该多义域为一圆弧的单义域;记录拟合的结果,作为总体识别的种子圆,转向5执行,否则执行3。

3. 对选中的多义域运用最小二乘法进行直线拟合;如果得到的平均距离误差和最大距离误差小于指定阈值,则认为拟合成功,该多义域为一线段的单义域;记录拟合结果,作为总体识别的种子直线,转向5执行,否则执行4。

4. 该多义域为多个线段或圆弧的组合。将该多义域的头尾节点连接,计算该多义域中各点与头尾节点连线的距离,取距离最大的点,对该多义域进行分裂,得到两个新的多义域,取代原先的多义域;转向2执行。 5. 取多义域列表中的下一个,转向2执行。

由此,所有的多义域都分裂为单义域,并对各单义域进行了拟合。

2.4 总体整合,识别直线和圆

对2.3得到的单义域列表进行总体的整合,得到直线和圆。

1. 选取单义域列表中的第一个单义域,将其拟合的图形(直线或圆)作

为种子图形;

2. 将列表中其他单义域的识别结果与种子图形进行比较,如果误差小于

指定阈值,则属于同一直线或同一圆,将其与选定单一域进行合并,从列表中删除该单义域;

3. 计算选定单义域的几何数据,得到图形; 4. 选取列表中的下一个单义域,转动2执行。

- 12 -

简单几何图形的识别和编辑

3. 主要技术

3.1 Borland C++ Builder

本论文的编程环境之所以选用c++ builder 是因为他有以下的优点: ⑴.输出入接口设计简单 ⑵.提供一流的开发环境

⑶.提供最标准的C/C++鲁开发工具

⑷.提供丰富的组件与最强劲的调试工具VCL类库中封装了Windows的图形设备接口(GDI),使得用户很方便地在应用程序添加图像或处理图像。

图像类主要有Tbitmap、TBrush、TCanves、TFont、TgraphakControl、Tgraphic、Ticon、TJPEGImage、TPen和Tpictur以Tmatifile类。

3.2 虚类及虚方法的使用

虚类和虚方法的使用在本论文中主要是Cshapes基类及虚方法的实现。

- 13 -

简单几何图形的识别和编辑

第三章 直线和圆的识别和编辑的实现

第一节 系统的层次结构的图示

- 14 -

简单几何图形的识别和编辑

第二节 系统数据结构及类的设计

1. 主要类的层次结构

1.1 图形处理类:

1.2 识别用类:

- 15 -

简单几何图形的识别和编辑

2. 图形基类(CShape)

2.1 描述

图形基类,提供所有图形的标准属性和方法。其他图形类(直线、圆)等都是该类的子类,继承其所有的public属性和方法,对其中的虚方法(virtual)进行重定义和实现。

该类为虚类,其成员函数主要为虚函数,为其所有子类提供统一的接口,但是没有实现。其他模块对图形进行操作时,除非生成新的实例(Instance),都无须知道所操作的是哪个具体的图形,而统一使用Cshape类型,为程序的实现、扩充和维护提供很大方便。

2.2 实现

class CShape { public: /* 属性定义 */

//前景色(由于时间等的限制,本系统暂时只定义该图形的属性,其 // 他如:填充色,线条型,填充型等可扩充) TColor color; /* 编辑用属性 */

//编辑时标志该图形是否被选择 bool isSelected; //编辑操作所选中的点 TPoint * editP /* 识别用属性 */

// 识别的效果描述,值越小说明识别效果越好 // 最小二乘法的平均误差;

// 霍夫变换:1 - 参数空间中该图形的值/最大值 double chance; //图形上点的数量 int pointCount; /* 成员函数定义 */ /* 显示和描述用方法 */

// 显示图形:在指定的位图上显示图形 virtual void draw(Graphics::TBitmap * argDest); // 描述图形:作为TtreeView的节点(主窗体使用) virtual void discript(int index, TTreeView * tree);

- 16 -

简单几何图形的识别和编辑

// 描述图形:返回描述图形的字符串 virtual String discript(); /* 识别用 */

// 比较两个图形,如果是同一个图形,返回True,否则False。 // 直线上的两个线段;圆上面的两个圆弧 virtual bool similarWith(CShape * argShape); // 合并两个图形

// 经过判断为相同的图形进行合并,返回True;否则返回False。 virtual bool mergeWith(CShape * argShape);

// 判断图形存在的可能性(利用具体图形的几何规则) virtual bool checkPossible(); /* 编辑用 */

// 判断是否点击该图形,若选中则当前编辑的图形改为当前图形 virtual bool isClickOnShape(int x, int y);

// 取得鼠标形状:鼠标移动到选中图形的可操作点上时,显示为编辑形状 virtual TCursor getCursor(int x, int y);

// 更新图形:将编辑点移动到(x, y)点。更新成功返回True,否则False。 virtual bool update(int x, int y); };

3. 图形类(CLine、CCircle)

3.1 描述

图形类是几何图形的具体实现,实现对应几何图形的描述和相关操作。图形类有共同的父类CShape,对父类中定义的虚方法根据本几何图形的特征进行实现。

根据要求,本系统中实现了直线(CLine)和圆(CCircle)两个图形类。其他简单的几何图形如椭圆、矩形等也可以类似的方法实现,作为本系统的一个扩充。

本系统中,直线类采用直观的Ax?By?C?0的形式来描述直线(既避免点斜式不能描述竖直直线,也避免极坐标方程转换的问题)。因为成比例的两组

(A1,B1,C1)和(A2,B2,C2)表示同一条直线,所以规定,如果B参数不为0,则B?1,否则A必定不为0,则A?1。由于要识别图像中的线段,所以增加两个端点进行限制。

- 17 -

简单几何图形的识别和编辑

直线类有三个点可以编辑:1)两个端点,选中一个端点并移动,是以另一端点为轴进行旋转;2)线段的中点,选中中点并移动,是平移整个直线。

圆类采用(x?xc)2?(y?yc)2?R2的形式描述(其中(xc,yc)为圆心,R为半径),直观方便。圆上有两个点支持编辑操作:1)圆心,选中圆心并移动,是平移整个圆;2)圆上的一个点,选中该点并移动,是改变圆的半径,圆心不变。

3.2 实现

? 直线类(CLine)

class CLine: public CShape { public: /* 初始化 */

CLine(double argA, double argB, double argC); /* 直线的属性 */ // 线段的两个端点 TPoint *startP, *endP; // 直线方程的参数:A,B,C double A, B, C; /* 对父类虚方法的实现 */

// 在目标位图上画出直线(本系统中的实现为画线段) void draw(Graphics::TBitmap * argDest); // 在TTreeView中描述

void discript(int index, TTreeView * tree); // 返回描述用字符串 String discript();

// 判断该直线是否与指定图形相同

// 将指定图形强制转化为CLine类型,比较其参数A, B, C, // 若小于指定阈值,则返回Ture,否则返回False。 bool similarWith(CShape * argShape); // 合并同一直线上的两个线段

// 若目标图形与该图形属同一直线,进行合并,返回True; // 否则返回False。

void mergeWith(CShape * argShape); // 判断是否选择该直线进行编辑。 // 判断指定点(x, y)到该直线的距离, // 如果小于指定阈值则返回True,否则False。 bool isClickOnShape(int x, int y); // 取得鼠标形状。

- 18 -

简单几何图形的识别和编辑

// 端点时返回45度,135度的双向箭头形状表示旋转; // 中点时返回垂直的四个方向箭头的形状表示移动 TCursor getCursor(int x, int y); // 更新直线

bool update(int x, int y); };

? 圆类(CCircle)

class CCircle: public CShape { public: /* 初始化 */

CCircle(int argX, int argY, int argR); /* 圆的属性 */ // 圆心

TPoint * centerP; // 半径 int R;

/* 对父类虚方法的实现 */ // 在目标位图上画出圆

void draw(Graphics::TBitmap * argDest); // 在TTreeView中描述

void discript(int index, TTreeView * tree); // 返回描述用字符串 String discript();

// 判断该圆是否与指定图形相同

// 将指定图形强制转化为CCircle类型,比较其参数圆心坐标和半径, // 若小于指定阈值,则返回Ture,否则返回False。 bool similarWith(CShape * argShape); // 合并同一圆上的两个圆弧

// 若目标图形与该图形属同一圆,进行合并,返回True; // 否则返回False。

void mergeWith(CShape * argShape); // 判断是否选择该圆进行编辑。

// 计算指定点(x, y)到圆心的距离,并与半径比较, // 如果小于指定阈值则返回True,否则False。 bool isClickOnShape(int x, int y); // 取得鼠标形状。

// 圆上点时返回水平的双向箭头形状表示改变半径; // 圆心时返回垂直的四个方向箭头的形状表示移动 TCursor getCursor(int x, int y);

- 19 -

简单几何图形的识别和编辑

// 更新圆

bool update(int x, int y); };

4. 图形容器类(CShapes)

4.1 描述

图形容器类是图形类的集合类,由C++ Builder的TList继承得到。用来组织对图像的识别结果、组织当前编辑工作的图形对象集。提供添加图形、删除图形、图形编辑等接口。

4.2 实现

class CShapes : public TList { public: /* 初始化 */ CShapes();

// 从TreeView得到Shapes CShapes(TTreeView * tree); //在目标位图上画出所有的图形

void drawShapes(Graphics::TBitmap * argDest); //描述图形

void discript(TTreeView * tree); };

5. 点类(CPoint)

5.1 描述

点类对于与图像上的前景点。由于识别时需要判断是否为交点,在一般的点的基础上增加是否为交点的属性。由C++ Builder的TPoint继承得到。

5.2 实现

class CPoint : public TPoint {

public: /* 初始化 */

CPoint() {isCrossPoint = false; };

- 20 -

简单几何图形的识别和编辑

CPoint(int argx, int argy, bool isCross);

CPoint(int argx, int argy, Graphics::TBitmap * argImg); /* 属性:是否为交点 */ bool isCrossPoint; };

6. 单义域类(CSegment)

6.1 描述

在“基于单义域的图形识别算法”中,单义域和多义域的唯一区别就是多义域不是单一的几何元素,其在存储结构上是一样的,在本系统中,都由CSegment类实现,姑且命名为单义域类。

单义域类为点的集合类,由C++ Builder的TList类继承得到。提供添加点、删除点、判断该单义域是否有识别价值、识别该单义域等接口和方法。

6.2 实现

class CSegment : public TList { public: /* 初始化 */ CSegment(CPoint * p);

/* 识别该单义域:实现算法中对单义域的识别部分 */ // 如果识别成功(得到圆或线段)返回True,否则返回False bool recognize();

/* 尝试添加新的点到该单义域 */

// 判断该点是否属于该单义域并确定是在头部还是在尾部,并将其插入到适当位置;如果该点为交点,则将相应的方向关闭增长;若加入成功返回True,否则返回False。 bool addNewPoint();

/* 判断该单义域是否有识别价值 */

// 如果该单义域含有的点数太少,则没有价值返回False,否则返回True。 bool checkValue(); /* 属性:识别出的图形 */ CShape * shape; };

- 21 -

简单几何图形的识别和编辑

7. 基于单义域识别类(CSegments)

7.1 描述

基于单义域识别类是实现“基于单义域的直线和圆识别算法”的主要类。它实现了对目标图像的分割、对分割结果的显示、对识别得到的多义域进行分割、对单义域识别结果的总体考虑,最终得到识别结果集。

基于单义域识别类同时是单义域的集合类,由C++ Builder的TList类继承得到。用来组织对图像的单义域分割后的结果。。

7.2 实现

class CSegments : public TList { public:

/* 构造和析构函数 */ CSegments(); ~CSegments();

/* 扫描图像,得到多义域 */

// 从上往下,从左往右扫描图像,对于每一个前景点 // 1。生成新的CPoint实例

// 2。对于本类中的所有单义域,将该点尝试加入

// 3。如果加入失败,以该点为头生成新的单义域并加入。 void segmentize(Graphics::TBitmap * argSrc);

/* 在指定的位图上显示分割得到的多义域、单义域 */ void displaySegments(Graphics::TBitmap * argDes); /* 识别该集合中的元素 */

// 1。调用单义域的checkValue(),如果得到False,删除该单义域; // 2。调用单义域的recognize(),如果返回False,对该单义域进行分割; // 将新得到的2个单义域取代当前的单义域,并进行识别 // 3。所有的单义域识别完毕后,对各个单义域的识别结果进行合并 // 4。返回得到的图形容器类。 CShapes * recognize();

/* 删除集合中的指定位置的元素 */ void removeItemOnly(int index);

void removeItemAndFreePoints(int index); };

- 22 -

简单几何图形的识别和编辑

8. 霍夫变换识别直线类(CHTLine)

8.1 描述

实现霍夫变换识别直线算法。

8.2 实现

class CHTLine { public:

/* 构造和析构函数 */ CHTLine (); ~ CHTLine ();

/* 对源位图按照直线识别算法进行霍夫变换 */ // argRho, argTheta分别是对 ? 和 ? 的分割的份数。

void recognize(Graphics::TBitmap * argSource, int argRho, int argTheta); /* 在目标位图上显示参数坐标的信息 */

// 以参数坐标的最大值为灰度最大值,按比例灰度在位图上显示。 void displayPramater(Graphics::TBitmap * argDest); /* 按照argRate指定的概率取得识别出的直线列表 */ void getLines(TList * argList, double argRate); };

9. 霍夫变换识别圆类(CHTCircle)

9.1 描述

实现霍夫变换识别圆算法。

9.2 实现

class CHTCircle { public:

/* 构造和析构函数 */ CHTCircle (); ~ CHTCircle ();

/* 对源位图按照圆的识别算法进行霍夫变换 */ void recognize(Graphics::TBitmap * argRes); /* 在目标位图上显示参数坐标的信息 */

// 以参数坐标的最大值为灰度最大值,按比例灰度在位图上显示参数坐标中指定半径的二维平面的数据。

- 23 -

简单几何图形的识别和编辑

void displayPramater(Graphics::TBitmap * argDest, int argR); /* 按照argRate指定的概率取得识别出的直线列表 */ void getCircles(TList * argList, double argRate); };

第三节 系统功能介绍

1.识别部分

(1).基于霍夫变换下的识别 启动recognize.exe

File->open 打开要识别的bmp文件

Hough Trans->ling recognize得到识别出的直线的霍夫变换图,图中的每个亮点代表一条直线;

识别的圆的概率圆,在下面的Edit控件中是你想要显示的圆的直径,输入后点display后就可以看到霍夫变换的结果

注:由于霍夫变换是一个三维的循环,消耗内存较多,速度较慢,所以图像的原图的大小直接影响到速度。 下面是几幅图象的实验结果:

图3.1 只含有直线的bpm文件

- 24 -

简单几何图形的识别和编辑

图3.2 图4.1的Hough Trans->line recognize的结果

再如另一个例子:

图3.3

图3.4 对上图显示直径为30 图3.5 对上图显示直径为60 (2). 基于分区-联合下的识别 1、2步如上

- 25 -

简单几何图形的识别和编辑

3,Segment->step1:Segmentize将整幅图像分区的结果 4,Segment->step2:Segment recognize识别分区后的各个部分

5,Segment->step3:recognize shape 对step2的结果进行整体识别,得到我们想要的结果

6,Segment->step1-3:Segment recognize 如果不想看实现的过程只想得到结果时执行此操作 下面用几个例子来说明 图3.1的识别过程

图3.6 图3.1的Segment结果(第一步)

图3.7 图3.1的Segment recognize结果(第二步)

- 26 -

简单几何图形的识别和编辑

图3.8 对上图recognize shape的结果

图3.8也是step1-3的结果。在form右边的Edit Box中是识别出的图元的相关信息:

直线时的A,B,C分别是方程Ax+By+C=0中的系数; 圆的时候,X,Y是圆心的坐标,R是圆的半径。 再如图3.3的识别过程:

图3.9 step1的执行结果

图3.10 step2的识别结果 图3.11 step3的识别结果

- 27 -

简单几何图形的识别和编辑

图3.12

其中最下面的line:0,Circle:1,Circle:2,…,Circle:4就是识别出的直线和圆的相关信息。

Line:0中的P1,P2是指直线的两个端点坐标、chance和count是对点的总体统计参数

Circle:1中的Center、r分别是圆的圆心和半径坐标。

- 28 -

简单几何图形的识别和编辑

第四章 总结及展望

计算机技术的发展,使人类社会进入了信息化和自动化,计算机智能识别也随着计算机的发展得到了迅速的发展。特别是图形图像的计算机处理技术更是有了前所未有的进步和应用。计算机识别也逐渐的从图形图像处理的大环境下分离出来作为一门新的高科技研究领域出现。图形图像的识别涉及到的学科很多,包括数字信号处理、工程数学、信息论、运筹学、等,它与计算机、自动化、生物学、关学、视觉心里和生理学、人工智能、智能信息处理等众多领域交叉、综合集成,有广泛的应用。

实现的是基础的图形识别,bmp图像文件格式中对图形的矢量化。识别基本的图元直线和圆。直线和圆是二值图像中最基本的组成元素,也是最常见的图形元素。在工程图的数字化识别中有很大的应用。

- 29 -

简单几何图形的识别和编辑

附录1:参考文献

·[1] 张习文、欧宗瑛.基于单义域邻接图的圆弧与圆识别[M].中国图像图形学报 2000版

·[2]王耀南、李书涛、毛建旭.计算机图像处理与识别技术[M].高等教育出版社.2005年版.

·[3]阮球琦.数字图像处理学[M].电子工业出版社. 2007

年版.

·[4]夏德深、傅德胜.现代图像处理与应用[M].东南大学出版社. 2001年版.

·[5] 孙增圻. 计算机控制理论与应用系统辨识-最小二乘原理[M]. 清华大学出版社.2008版

·[6]朱时银.c++ builder 编程实例与技巧[M].机械工业出版社. 2001年版.

- 30 -

简单几何图形的识别和编辑

附录2:结束语

在当今高科技发展的环境下,图像处理的需求和应用愈来愈广泛,技术亦愈来愈高,本人通过本论文的编写及实现过程对图像处理和模式识别有了很多的理解和更深刻的认识。

综上所述,本系统达到了预期的目标,并具有很大的扩展性。经过必要的完善和补充,将可以成为一个实用的工具。

请允许我向所有在本论文的撰写过程中,在我这两年的学习和生活中给予我帮助和关心的老师、同学表示诚挚的谢意。

特别是指导老师方冰,给予了我无私的帮助,在这里一并感谢。

- 31 -

简单几何图形的识别和编辑

附录2:结束语

在当今高科技发展的环境下,图像处理的需求和应用愈来愈广泛,技术亦愈来愈高,本人通过本论文的编写及实现过程对图像处理和模式识别有了很多的理解和更深刻的认识。

综上所述,本系统达到了预期的目标,并具有很大的扩展性。经过必要的完善和补充,将可以成为一个实用的工具。

请允许我向所有在本论文的撰写过程中,在我这两年的学习和生活中给予我帮助和关心的老师、同学表示诚挚的谢意。

特别是指导老师方冰,给予了我无私的帮助,在这里一并感谢。

- 31 -

本文来源:https://www.bwwdw.com/article/c2pr.html

Top