Delphi实现计算机视觉常用图像处理算法.docx
- 文档编号:8798440
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:65
- 大小:1.89MB
Delphi实现计算机视觉常用图像处理算法.docx
《Delphi实现计算机视觉常用图像处理算法.docx》由会员分享,可在线阅读,更多相关《Delphi实现计算机视觉常用图像处理算法.docx(65页珍藏版)》请在冰点文库上搜索。
Delphi实现计算机视觉常用图像处理算法
Delphi实现计算机视觉常用图像处理算法
摘 要:
由于图像处理涉与到了大量的程序编制工作,因此,如何合理选择一种简洁高效的编程工具,减少研究工作中的复杂性,就成为了计算机数字图像处理中不可回避的问题。
本文就利用Delphi实现对计算机视觉中常用图像处理方法。
关键词:
计算机视觉;数字图像处理;Delphi
TheAlgorithmsforImageProcessingofComputerVisionImplementedinDelphi
Abstract:
Imageprocessinginvolveslotsofprogramming.Hencehowtoselectaprogrammingtoolwithsimplicityandhighefficiencybecameanunavoidableproblemincomputer-baseddigitalimageprocessing.Forreference,thisarticleimplementedtheimageprocessingalgorithmsincommonusewithDelph.i
Keywords:
computervision;digitalimageprocessing;Delphi
1 引 言
计算机视觉[1]是采用各种成象系统代替视觉器官作为输入手段,并通过计算机技术来完成替代大脑完成处理和解释任务的一门学科,其最终研究目标就是使计算机能象人那样通过视觉观察和理解世界,具有自主适应环境的能力。
在计算机视觉的发展过程中,图像处理、模式识别、图像理解这一系列相关学科的发展对其有着至关重要的推动作用。
本文中,就将如何利用Delphi开发工具对计算机视觉中应用较多的一些数字图像处理方法进行实现进行详细讨论。
1 Delphi实现技术
在Delphi中,专门定义了一组对象和部件用以绘制图形[2],完成一些简单的图像功能。
利用这些对象、部件的方法,可以方便地绘制各种常用图形;通过设置它们的属性,能得到不同风格的图形。
另外,通过对鼠标事件的定义,可以方便地设计图形绘制程序。
Delphi中的各图像编程对象见图1。
图1 Delphi图像编程对象图
与其他的按照像素对位图进行操作的编程工具不同的是,Delphi中提供了ScanLine函数[3],使得在Delphi中处理位图,可以行作为处理单位,加快处理的速度,简化处理的操作,函数声明和具体操作方法如下:
PropertyScanLine[Row:
Integer]:
Pointer;其中Row为位图图像的行号,返回的是一个指向
位图像素数据的指针,换言之,在程序编制时,只需要简单的调用ScanLine[n],就可以获取第n行的所有像素点的颜色值,编程简洁高效。
程序界面与需处理图像如2所示。
图2 程序界面图
2 常用处理实现
2.1 图像灰度处理实现
将彩色图像转化为灰度图像的过程称为图像的灰度化处理[4]。
彩色图像中的每个象素的颜色由R、G、B三个分量决定,而每个分量有255种值可取,每个像素点可表示的色彩数目为255×255×255=16581375,约1400万种颜色。
灰度图像是R、G、B三个分量一样的一种特殊的彩色图像,每个像素点可表示的色彩数目仅为255种。
在数字图像处理中,大部分情况下特别是图像识别中首先进行的操作即将图像灰度化,降低图像处理的复杂度。
图像的灰度化处理可用下列两种方法实现:
(1)求出每个像素点的R、G、B三个分量的平均值,然后将这个平均值赋值给这个象素颜色的三个分量。
(2)根据YUV颜色空间中的Y分量意义转换。
YUV颜色空间中,Y的分量代表点的亮度,由公式Y=0.3×R+0.59×G+0.11×B可换算出Y值用以表示图像的灰度值。
实现效果如图3所示。
图3 灰度处理效果图
2.2 图像二值化实现
在计算机视觉处理中,图像的二值化操作[4]是其中极其重要的一个基本操作,大量的数字图像处理工作都是基于二值化的结果来进行的。
二值化其0、1两种表示的简单性,使得图像的处理工作变得十分简单高效。
进行二值化操作,一般是将图形灰度化处理,之后对灰度图进行二值化操作。
图像二值化的具体方法是:
通过设定阈值(Threshold),把灰度图像变化成仅用两个值(0或1),公式如下:
g(x,y)=1f(x,y)≤T
0f(x,y)>T
T为阈值
二值化操作中的关键在于阈值的选择。
阈值的选择主要分为两类:
全局阈值和局部阈值。
全局阈值是对整个图形采用一个阈值进行划分。
局部阈值是将图形分为一些子块,对于每一子块选定一个阈值。
实现效果如图4所示。
图4 图像二值化效果图
2.3 图像中值滤波去噪
在计算机视觉的图像识别中,由于图像中不可避免地会存在一定的噪声污染,在图形识别前,必须对图像进行一定的图像增强操作。
中值滤波[4]作为其中的解决方法之一,在某些条件下可以做到既去除噪声又保护了图像边缘的较满意的复原效果,在图像识别中也有较为广泛的应用。
中值滤波的基本原理是,把图像或数字序列中的一点的值用该点的一个邻域中各点值的中值代替。
(中值是中间位置的值,而不是平均值。
)其定义为:
一组数x1≤x2≤……≤xn,把n个数按值的大小
顺序排列如下
y=Med(x1,x2,…,xn)=
x1(n+12)n为奇数
2[xi(n2)+xi(n2+1)]n为偶数时
y称为序列x1≤x2≤…≤xn的中值。
例如有一序列为{80,90,200,110,120},这个序列的中值为110。
把一个点的特定长度或形状的邻域称作窗口。
在一维情形下,中值滤波器是一个含有奇数个象素的滑动窗口。
窗口正中间那个象素的值用窗口各象素值的中值代替。
设输入序列为{xi,i∈I}I为自然数集合或子集,窗口长度为n。
则滤波器输出为:
yi=Med{xi}=Med{xi-u……xi……xi+u}
其中i∈I,u=(n-1)/2。
实现效果如图5所示。
图5 中值滤波效果图
2.4 图像边缘检测演示
在计算机视觉中的图像分割操作中,边缘的获取是基于边界的图像分割方法的第一步,也是描述图像区域最重要的特征之一。
要进行边缘的获取,就要进行边缘检测工作,为图像分割、纹理特征和形状特征抽取提供分析依据。
由于边缘检测在其中所起到的基础作用十分明显,因此它已经成为目前计算机视觉研究领域中最活跃的课题之一。
图像中的边缘通常与图像强度或图像强度的一阶导数的不连续性有关[7].图像强度的不连续可分为:
(1)阶跃不连续,即图像强度在不连续处的两边的像素灰度值有着显著的差异;
(2)线条不连续,即图像强度突然从一个值变化到另一个值,保持一个较小的行程后又返回到原来的值。
对这种阶跃不连续和线条不连续的结果,可利用求导方式进行检测,目前常用的技术是利用梯度算子和拉普拉斯算子[5]进行求取,这里主要介绍梯度算子的实现。
一阶导数fx和fy是最简单的导数算子,分别表示灰度在x和y方向上的变化率,而在方向r上的灰度变化率可以表示为:
f
r=fxcosθ+fysinθ
对于数字图像一般采用差分运算代替求导,相对
应的一阶差分为:
Δxf(i,j)=f(i,j)-f(i-1,j)
Δyf(i,j)=f(i,j)-f(i,j-1)
方向差分为:
Δrf(i,j)=Δxf(i,j)cosθ+Δyf(i,j)sinθ
方向导数的最大值|G|=(fx)2+(fy)2称为梯度模,实际中可利用梯度模算子来检测边缘具有位移不变性,常用的梯度算子有Roberts,Prewit,tSobe,lIsotropicSobel等。
实现效果如图6所示。
图6 边缘检测效果图
3 结 语
从以上Delphi对图像处理中涉与到各个算法的实现可以看出,Delphi除了在数据库编程、window编程等方面拥有很强的优势外,在图像处理上也有着非常强大的功能,Delphi在图像处理上的速度并不亚于VC,但在开发效率上远远超过VC。
在整个算法的实现过程中,Delphi的实现代码十分精简高效,特别是在充分利用Delphi图像编程对象和ScanLine方法后,整个程序仅需要少量代码就可以完成一个算法的实现过程。
同时,由于Delphi本身在程序开发上的传统优势,使得Delphi实现的程序比起Matlab等其他工具实现的程序来说,更具有广泛的适用性,是研究人员在计算机视觉研究中值得选择的一个开发工具。
基于C#的三种数字图像处理方法
摘 要:
为更快速地进行图像算法的开发,介绍了三种基于C#语言的图像处理方法:
直接提取像素法、存法和指针法.通过对彩色图像进行灰度化这一简单的数字图像处理算法实验,比较了这三种方法的特点.
关键词:
图像处理;C#;像素;存;指针
在过去的二三十年间,C/C++已经成为在商业软件的开发领域中使用最广泛的语言.但它在给程序员带来灵活性的同时,也牺牲了开发效率.用C/C++开发应用程序往往需要更长时间,用C/C++编写数字图像处理算法尤其如此,对于初学者来说,既要精通图像处理算法,又要熟练掌握这种语言的语法结构,似乎是一件很难的事情.
C#是一种新的面向对象的编程语言,它使程序员可以快速地开发出基于Microsof.tNET平台的应用程序.更重要的是,它没有损失C/C++原有的强大功能,继承了C/C++的灵活性.[3]应用C#语言,通过对彩色图像的灰度化这一简单的图像处理算法,较详细地介绍3种基于C#的方法,并比较了它们的特点.
1 三种数字图像处理方法
下面通过把彩色图像灰度化来详细介绍图像处理的三种方法.灰度化的算法是先读取彩色图像中每个像素的颜色值,然后通过下面的公式得到灰度值:
P=R×0.299+G×0.587+B×0.114,式中P为最终的灰度值,R、G和B分别为该像素中的红色、绿色和蓝色分量值.最后再把该灰度值P分别赋予R、G和B.
1.1 直接提取像素法 它是利用下一代的图形设备接口———GDI+中的BitmapGetPixel和Bitmap
SetPixel方法.[4]235GetPixel和SetPixel方法是分别获取和设置一个图像的指定像素的颜色.
下面代码具体是如何用该方法进行灰度化,它通过两重循环逐个像素点进行处理:
(//创建一个Bitmap对象)
BitmapmyBitmap=newBitmap(“lenna.bmp”);
(//使用GetPixel和SetPixel将所有像素都设置为灰度)
for(inti=0;i { for(intj=0;j { ColormyColor=myBitmap.GetPixel(,ij); intret=(int)(myColor.R*0.299+myColor.G*0.587+myColor.B*0.114); myBitmap.SetPixel(,i,jColor.FromArgb(re,tre,tret)); } } 1.2 存法 存法和下面介绍的指针法都使用了Bitmap类提供的LockBits和UnlockBits方法,它们的作用是分别锁定和解锁系统存中的位图像素.在基于像素点的图像处理方法中使用LockBits和UnlockBits是一个很好的方式,这两种方法可以通过指定像素的围来控制位图的任意一部分,从而消除了通过循环对位图的像素逐个进行处理的需要.每次调用LockBits之后都应该调用一次UnlockBits.存法还用到了MarshalCopy方法,它可以将数据从托管数组复制到非托管存指针,或从非托管存指针复制到托管数组. 下列代码具体是用该方法进行的灰度化: BitmapmyBitmap=newBitmap(“lenna.bmp”); (//锁定位图像素) Rectanglerect=newRectangle(0,0,myBitmap.Width,myBitmap.Height); System.Drawing.Imaging.BitmapDatabmpData=myBitmap.LockBits(rec,t System.Drawing.Imaging.ImageLockMode.ReadWrite,myBitmap.PixelFormat); System.IntPtrptr=bmpData.Scan0; (//定义位图数组) intbytes=myBitmap.Width*myBitmap.Height*3; byte[]rgbValues=newbyte[bytes]; System.Runtime.InteropServices.Marsha.lCopy(pr,trgbValues,0,bytes); doublecolorTemp=0; for(intcounter=0;counter { colorTemp=rgbValues[counter+2]*0.299+rgbValues[counter+1]*0.587+ rgbValues[counter]*0.114; rgbValues[counter]=rgbValues[counter+1]=rgbValues[counter+2]=colorTemp; } (//把像素值复制回位图) System.Runtime.InteropServices.Marsha.lCopy(rgbValues,0,ptr,bytes); myBitmap.UnlockBits(bmpData); 1.3 指针法 该方法与存法相似,开始都是通过LockBits方法来获取到位图的首地址,但该方法更简洁,直接应用指针对位图进行操作.为了保持类型安全,默认情况下,C#是不支持指针运算的,因为使用指针会带来相关的风险,所以C#只允许在特别标记的代码块中使用指针,通过使用unsafe关键字,可以定义 可使用指针的不安全上下文 下列代码具体是用该方法进行的灰度化: BitmapmyBitmap=newBitmap(“lenna.bmp”); Rectanglerect=newRectangle(0,0,myBitmap.Width,myBitmap.Height); System.Drawing.Imaging.BitmapDatabmpData=myBitmap.LockBits(rec,t System.Drawing.Imaging.ImageLockMode.ReadWrite,myBitmap.PixelFormat); System.IntPtrptr=bmpData.Scan0; intbitmapLength=myBitmap.Width*myBitmap.Heigh;t (//应用指针对位图进行灰度化) unsafe { byte*pix=(byte*)(void*)pr;t bytetemp=0; for(inti=0;i { temp=(byte)(0.299*pix[2]+0.587*pix[1]+0.114*pix[0]); pix[0]=pix[1]=pix[2]=temp; pix+=3;} } myBitmap.UnlockBits(bmpData); 使用该方法要注意的是,因为在默认情况下,C#不支持指针运算,所以要想成功地编译上述语句,就得在编译器选项中把“允许不安全代码”的复选框选上方可. 2 3种方法的比较 数字图像处理实际上涉与到的是二维矩阵的运算,它是一个很耗时的运算过程.因此如何提高它的效率就成为图像处理算法的关键,所以在这里主要比较3种算法的运行时间.通过对512×512的BMP彩色图像[6]进行灰度化来测试3种方法运行的时间.其中只对核心算法进 行计时.运行环境是硬件配置为CPU: AMDAthlon4400+;存: DDRII-800,1G;软件配置为MicrosoftWindowsXPSP2: VisualStudio2005.直接提取像素法平均运行时间为729ms;存法平均运行时间为11ms;指针法平均运行时间为8ms.明显看出,存法和指针法比直接提取像素法要快得多.直接提取像素法应用GDI+中的方法,易于理解,方法简单,很适合于初学者使用,但它的运行速度最慢.存法是把图像复制到存中,直接对存中的数据进行处理,速度明显提高,程序难度也不大.指针法因为直接应用指针来对图像进行处理,所以速度最快.但在C#中,是不建议使用指针,因为使用指针,代码不仅难以编写和调试,而且无法通过CLR的存类型安全检查.只有对C#和指针有充分理解,才能用好该方法.究竟要使用哪种方法,还要看具体情况而决定,但三种方法都能有效地对图像进行处理. 3 总 结 C#是专用于.NET平台的一种新型编程语言,不仅功能强大,而且用法灵活,利用它几乎可以开发出运行在Windows上的所有桌面应用程序和网络应用程序.总结了基于C#语言的三种图像处理方法: 直接提取像素法、存法和指针法.直接提取像素法简单易懂,但运行时间最慢;指针法运行时间最快,但不易掌握;存法介于两者之间.通过举一反三,可以应用上述三种方法中的任意一种,开发出其他更复杂的数字图像处理算法来. 基于Delphi的小型图像处理系统设计 [摘要]使用Delphi软件实现图像的各种数字变换处理并开发出小型图像处理系统,完成图像的获取、存 储、复制、粘贴;并实现图像的几何变换与浮雕、锐化、平滑、反色等各种图像的处理。 [关键词]图像图像处理Delphi 随着计算机的发展,数字图像技术近年来得到极大的重视和长足的发展,出现了许多有关的新理论、新方法、新算法、新手段和新设备,并已在科学研究、工业生产、医疗卫生、教育、娱乐、管理和通信等方面得到了广泛的应用,对推动社会发展改善人们生活水平都起到了重要的作用。 本文使用Delphi软件实现图像的各种数字变换处理并开发出小型图像处理系统,完成图像的获取、存储、复制、粘贴;并实现图像的几何变换与浮雕,锐化,平滑,反色等各种图像的处理。 1图像的概念 图像可粗分为两大类: 位映像图像和向量图像。 基于计算机的位映像图像是对电视图像的数字化,它易于描述真实景物,真实世界中的景物可以用扫描仪生成图像文件并在计算机上显示。 而向量图像易于表达艺术家设计的图像。 这两者在表达方式上不同。 为简单起见,可把位映像图像看成是点矩阵(简称点阵)。 在图形学中,把矩阵中的点称为像素(Pixel)。 位映像图像根据彩色数分为以下四类: 单色图像、具有4-16种彩色的图像、具有32-256色的图像和256色以上的图像。 也可把这四类图像称为单色图像、低彩色分辨率图像、中等彩色分辨率图像和高彩色分辨率图像。 把单色图像称为是1位图像,这是因为图像中的每一个像素仅需1位信息;把16色图像称为是4位彩色图像,这是因为图像中的每个像素需4位信息;另一种常见的图像是256色图像,也称8位彩色图像。 256色图像有照片效果,比较真实。 另外一种具有全彩色图片表达能力的图像为24位彩色图像。 由于彩色的种类很多,每个像素需24位,使得彩色图像需要的存储空间很大。 在图像文件的存储格式中也是以位来存储颜色的。 位图图像是以纪录屏幕上图像的每一个黑白或彩色的像素来反映图像。 2小型图像处理系统设计 2.1菜单设计 通过Delphi提供的菜单设计工具MenuDesigner可方便的进行菜单设计,同时可以为一个菜单项同时设置加速键和快捷键,小型 图像处理系统菜单设计如图1所示。 图1小型图像处理系统菜单结构 2.2工具栏设计 工具栏上有许多ToolButton工具按钮,这些按钮可以用不同图标表示。 利用工具栏可以方便地实现对菜单命令的访问。 例如,可以直接实现打开和存储文件等操作。 制作菜单栏和工具栏需要使用大量的图标,Delphi在“Borland公用文件”中为用户提供了许多常用的图标,本系统工具栏设计如图1所示。 3图像的几何变换与处理的实现 3.1图像几何变换的设计实现 图像的几何变换是图像处理中的一个重要应用,主要包括图像放大和图像缩小。 图像放大的实现原理是对X、Y方向伸缩比进行增加;图像缩小的实现原理是对X、Y方向伸缩比进行减小,本系统设计的图像缩小运行结果如图2所示。 图2(a)图像缩小前图2(b)图像缩小后 3.2图像处理的设计实现 图像处理就是对图像信息进行加工处理,以满足人的视觉心理和实际应用的要求。 3.2.1图像灰度处理 图像由彩色转化为灰度的过程叫做灰度化,由于位图为点阵图像,它的每一个像素点由R、G、B三个分量组成,R、G、B的变化可以产生1600多万种颜色。 在Delphi中灰度化有几种方法可以实现,本系统采用求出每一个像素点的R、G、B的平均值,然后把这个平均值赋给该像素点的R、G、B三个分量。 系统运行结果如图3所示。 图3图像的灰度处理 3.2.2图像亮度处理 亮度的调整是指对人眼亮度感觉的调整,在RGB颜色空间中一般是R、G、B三个分量同时进行增加或减少进行调节。 本系统通过给R、G、B各个分量增加一样的值来实现图像的亮度处理。 3.2.3图像反色处理 对于一幅24位的真彩色位图,它的每一个字节由R、G、B三个分量构成,图像的反色就是对R、G、B三个分量同时进行取反操作,在Delphi图像处理中可以实现24位真彩色图像的反色操作。 3.2.4图像平滑处理 消除图像的噪音与满足彩色复制特殊需要的方法,在图像处理中称为图像平滑,它分为空间域处理和频谱域处理两种,主要有领域平均法、低通滤波法和多图像滤波法等,本系统采用领域平均法。 3.2.5图像锐化处理 图像的锐化是要消除模糊,必须增强图像中频率高的空间频率成分。 它是一种使图像具有的信息让人们易于观察图像质量改善的方法,从数学角度上讲就是对图像进行微分化处理。 在图像中,边缘是由灰度级和相领域点不同的像素点构成的。 因而,若想增强边缘,就应该突出相邻点间的灰度级的变化。 微分运算可用来求信号的变化率,因而具有加强高频分量的作用。 如果将其应用在图像上,可使图像的轮廓清晰。 由于常常无法事先确定轮廓的取向,因而挑选用于轮廓增强的微分算子时,必须选择那些不具备空间方向性的和具有旋转不变的线性微分算子。 用这种方法可以去掉引起图像质量劣化的“模糊”,并把图像变得轮廓分明。 3.2.6图像浮雕处理 浮雕效果就是只将图像的变化部分突出来,而一样的颜色部分则被淡化,使图像出现纵深感,从而达到浮雕效果,有灰色浮雕和彩色浮雕两类。 接下来我们主要介绍灰色浮雕,它采用的算法是将要处理的像素取值为与处于对角线上的另一个像素间的差值,这样只有颜色变化区才会出现彩色,而颜色平淡区因差值几乎为零则变成黑色,你可以通过加上一个常量来增加一些亮度。 3.2.7中值滤波处理 对受到噪声污染的图像可以采用线性滤波的方法来处理,但是很多
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 实现 计算机 视觉 常用 图像 处理 算法
![提示](https://static.bingdoc.com/images/bang_tan.gif)