摘 要
随着电子技术的高速发展和离散数学深入研究,使得图像处理成为可能,并在各领域中都得到了广泛的应用。图像特征的提取,特别是图像中线状特征的提取在图像处理和模式识别中有着极其重要的地位和作用,它的应用领域不断扩大,对它的研究日趋深入。
为了得到相对较好的提取效果,本文对现有边缘提取的主要方法和技术进行了分析、研究和实现,提出了对数字图像中线状特征进行提取的改进方案,并对它们进行了实现。具体提出了三种改进方案:其一,是对Sobel算子的改进,主要是添加了算子检测的方向,由原来的垂直、水平两方向增加到了0°、45°、90°、135°四方向。其二,是对方向算子Krisch权值的修改。其三,是对Laplace算子进行了扩大,并设定了适当的权值。对使用经典算法提取效果不理想的数字图像,本文采用先对原图的灰度分布进行分析,根据分析结果进行适当的灰度扩展(或灰度均衡),然后施行线特征提取算法, 改善了提取效果。
关键字: 图像处理 线特征 边缘检测 灰度
Abstract
With the rapid development of
electronic technology, and study deepening of dispersed mathematics,
make the image processing become
possible,
and widely used in many field, especially the extraction of the
linear feature in digital image …………………………….
目 录
摘要 ……………………………………………………………………
i
Abstract…………………………………………………………………
i
第一章
绪论………………………………………………………… 1
1.1研究背景……………………………………………………………………
1
1.2实验环境简介………………………………………………………………
1
1.2.1 C++ Builder的特点…………………………………………………………
1
1.2.2所用的组件、方法的介绍……………………………………………………
2
第二章
线特征提取的主要方法…………………………………… 4
2.1 Robert 算法 ……………………………………………………………………… 4
2.2 Sobel算法 和Prewitt算法 …………………………………………………
4
2.3 Laplace 算法………………………………………………………………………
5
2.4 LOG算法…………………………………………………………………… 5
2.5 Krisch算法………………………………………………………………………… 6
第三章
线特征提取算法的改进…………………………………… 7
3.1边缘检测算法的实验结果分析 …………………………………………………
7
3.2 改进算法的设计……………………………………………………………………
8
3.2.1对彩色图像的预处理 …………………………………………………………
8
3.2.2边缘提取算法的改进 …………………………………………………………
10
3.3改进算法的实现与实验结果分析………………………………………………
11
第四章
总结与展望 …………………………………………………
13
3.1所做的工作……………………………………………………………………………
13
3.2存在的不足和努力方向 ……………………………………………………………
13
参考文献…………………………………………………………………………………………
14
附录A
线特征提取软件使用说明书……………………………………………………… 15
第一章
绪
论
1.1研究背景
随着离散数学的创立和完善,数字技术和大规模集成电子技术的高速发展,使得图像信息的采集、处理、传输、显示和存贮成为可能;再加上现代社会信息化的突飞猛进,各行各业,如航天、航空、医疗卫生、军事公安……等等领域的迫切需求,数字图像的处理技术也随之发展起来,并且在近30年的研究中取得了不小的成果。其中的有关线条提取的研究同样得到了人们广泛的关注。
线条提取实际上是图像分割中的一部分,是图像信息预处理的一种方法,它的基本原理是将图像中的有意义的线特征或者有利用价值的轮廓提取出来,从而使人们所关心的目标得以增强。例如交警追踪违章车辆,他们所关心的只是违章车的车牌,所以只需要将车牌上的字符提取出来让计算机识别,而其余部分就都可以省略或淡化;再如公安机关指纹、掌纹的识别等,这些都涉及到了数字图像处理中的有关线条的提取问题。由于社会的不断进步对这方面的应用与需求也越来越广,这就推动了此领域研究,到目前为止被人们广泛应用与线条提取的就有诸如梯度算子、Sobel算子、Hough变换、Laplace算子和利用灰度直方图等方法,以及基于各种数学变换的图像边缘提取技术,如小波变换、Rando变换等,还有就是综合多种图像处理方法而提出的算法,其中应用最广泛,效果也较好的就是LOG算法,它利用了高斯函数对图像进行平滑,然后再用Laplace算子运算。
当然一幅图像的色彩繁杂、线条交错,而上面所说的方法并不能满足所有的提取需求,并且可以说是存在着一定的不足。所以为了得到良好的提取效果,就必须在现有技术的基础上再进一步深入研究,针对不同的图像、不同的需求采用不同的方法进行提取。
1.2 实验环境简介
1.2.1 C++ Builder的特点
C++
Builder和Delphi一样是由Borland公司开发,是Windows环境下功能强大的C++开发环境,它全面实现了ANSI C++
标准,提供了自己的扩展,并且兼容PC计算机上的两种最常用的C++编译器,即Borland C++和Visual C++,它们的程序几乎不用作任何修改就可以在C++
Builder下编译通过。C++
Builder的最显著的特点就是它实现了C++语言完全可视化开发,将C++的面向对象和可视化紧密地结合起来,提供了一个功能强大、开发效率高的集成开发环境。
它的主要特点是:
1)
可视化的C++ 开发环境
C++ Builder提供了符合ANSI/ISO标准、功能强大的C++编译器,并集成功能完整、高效的可视化开发环境,C++
Builder运用面向对象技术构造以组件为基础的开发结构,提供了200多个软件组件。它的集成开发环境主要包括了主窗口、对象查看器、类别浏览器、代码编辑窗口以及窗体(Form)。
2)
利用XML的InternetExpress技术,快速开发高效WEB及Internet应用程序
3)
简化分布式应用系统的开发,运用MIDAS支持多层分布式应用系统。
4)
高效存取数据库,利用BDE、ADOExpress组件存取各类异质数据
5)
封装了Windows图形处理功能。
6)
方便、强大的调试功能。
本文采用C++ Builder作为实验开发环境,不是因为它强大的数据库应用支持,而是它的封装的Windows图形图像处理功能。C++
Builder用于图像处理的组件以及这些组件用于图像处理的属性和方法(如Tbitmap组件及其scanline、pixel属性)极大地降低了图像处理上的编程开销,可以使主要精力集中在算法的研究与实现上。
1.2.2
所用组件属性、方法的介绍
在本文相关的实验中,主要是进行对图像的轮廓提取进行提取,所以主要涉及C++
Builder中用于图像处理的一些组件及其属性和方法。
在C++ Builder中进行图像处理,总的来说是依赖于图形图像相关类中的Canvas属性,它所带来的优势——有效的操控图像源和兼顾图像设备的上下关系——可以使得在使用同样的图像处理方法时忽视图像是在屏幕上显示还是用来打印,是位图还是图元文件。而在本软件中对它的使用主要是建立在Timage类上,通过Timage来调用此属性,以完成对图像的各种处理。
1) TImage和TGraphic
Timage对象可以用来在其中显示、绘制图像,而其中Picture属性用来指定实际的位图、图画或者其他的一些图形对象通过Image对象来显示。
Picture属性是一个TPicture对象,使用这个属性可以方便的装入和保存一幅图像。动态的装入图像可以使用Picture属性的LoadFromFile方法,例如:
if(OpenPictureDialog1->Execute())
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
保存一幅图像可以使用Picture属性的SaveToFile方法,例如:
if
(SavePictureDialog1->Execute())
Image1->Picture->SaveToFile(SavePictureDialog1->FileName+".bmp");
同时在Timage组件中还有一个有着“举足轻重”地位的Canvas属性,利用它就可以在Timage组件上绘图,但值得注意的是,它只对位图起到作用,如果不是位图,运行之后就会抛出一个异常。如在实验中就频繁的使用此属性进行绘图:
Graphic::Tbitmap
*bitmap=new Graphics::Tbitmap
……
bitmap=……;
……
Image1->Canvas->Draw(0,0,bitmap);
在上面的例子中用到了一个Graphic来定义bitmap,TGraphic是一个抽象类,它有一个名为graphics的派生类来实现它父类的一些方法,以及对一些特殊文件格式和图形特征的需求。TGraphic类同样引入了对TPicture对象和剪贴板起作用的一些方法。它的对象是Tbitmap,Ticon,Tmetafile对象的基类。在本软件中同样使用的是它的Tbitmap对象,通常的用法是如上例中来定义一个Tbitmap的变量bitmap,以此来方便以后的绘图成像。
2) Scanline和Pixels的区别
在边缘提取的实验中的做法是首先打开一幅图像到TImage组件中,然后对此图像进行边缘提取,并将做了提取处理之后的图像绘制在一个名叫PaintBox的组件中。那么,对PaintBox的组件中的图像是怎样生成的呢?当然可以使用一个从属于Tcanvas属性的Pixels属性和一个从属于Tbitmap属性的ScanLine属性。虽然它们都可以用来绘制图像但它们之间的使用还是有一定的区别的。
首先,ScanLine被称为扫描线,顾名思义使用它就可以每次读进它所指向的图像的每一行,如可以使用下列语来读进图像的第一行:
BYTE
*LineY;
LineY=(BYTE*)Image1->Picture->Bitmap->ScanLine[0];
而Pixels读取和绘制的是图像的每一个像素。所以同样是一行,用它来绘制的话却要调用它一行像素数次。所以在速度上使用ScanLine要比使用Pixels要快得多的多。
第二,在C++ Builder中灰度图像的每一像素值是由R、G、B三个值调和出来的,所以ScanLine每取进一行y就要取进三列即3*x、3*x+1和3*x+2来表示一个像素值。如要对一幅图像进行复制就可如下操作:
BYTE
*LineY,*LineY_out;
int x,
y;
for(y=0;y<Image1->Height;y++)
{
LineY=(BYTE*)Image1->Picture->Bitmap->ScanLine[0];
LineY_out=(BYTE*)
Image2->Picture->Bitmap->ScanLine[0];
for(x=0;x<Image1->Width;x++)
{
LineY_out[3*x]=LineY[3*x];
LineY_out[3*x+1]=LineY[3*x+1];
LineY_out[3*x+2]=LineY[3*x+2];
}
}
而Pixels读进的每个像素值是已经对R、G、B三个值进行了计算而得出的。
最后还将补充一点,使用Pixels属性还可以方便的用来单独确定一像素的颜色,如
Image1->Canvas->Pixels[x][y]=RGB(123,211,50);
或
Image1->Canvas->Pixels[x][y]=clRed;