1、阈值分割区域分割边缘检测Hough变换目录分水岭算法阈值分割阈值分割 阈值分割法是一种基于区域的图像分割技术,它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤。阈值分割法是一种传统的最常用的图像分割方法,特别适用于目标和背景占据不同灰度级范围的图像。图像的阈值分割是一种按图像像素灰度幅度进行分割的方法,把图像的灰度分成不同的等级,然后用设置灰度门限(阈值)的方法确定有意义的区域或要分割物体的边界。阈值分割操作被定义为:因此,阈值分割将图像内灰度值处于某一指定灰度值范围内全部点选到输出区域S中。如果光照能保持恒定,阈值 和 能在系统设置时被选定且永远不用被调整。阈值分割法),(max,
2、mingfgRcrScrmingmaxg阈值分割法对于只有背景和目标两类对象的灰度图像来说,阈值选取过高,容易把大量的目标误判为背景;阈值选取过低,又容易把大量的背景误判为目标。一般来说,阈值分割可以分成以下三步:(1)确定阈值;(2)将阈值与像素灰度值进行比较;(3)把像素分类。阈值分割的优点是计算简单、运算效率较高、速度快。阈值分割的几个难点是:在图像分割之前,无法确定图像分割生成区域的数目;阈值的确定,因为阈值的选择直接影响分割的精度及分割后的图像进行描述分析的正确性。如果图像由暗色背景上得较亮物体组成,以这样组成方式的图像的灰度直方图具有明显谷底,从背景中提取物体的一种很明显的方法就是
3、选择两峰之间的谷底对应的灰度值T作为阈值进行图像分割。T值的选取如图所示:根据直方图谷底确定阈值法根据直方图谷底确定阈值 分割后的图像由下式给出:根据直方图谷底确定阈值法),(yxg TyxfTyxfxg,0255对于有多个峰值的直方图,可以选择多个阈值。例如,当有两个明显谷底时,可以表示为下式:1212,TyxfcTyxfTbTyxfaxg,在Halcon中直方图谷底确定阈值算子如下:程序如下:*读取图像read_image(Image,letters)*获得图像尺寸get_image_size(Image,Width,Height)*关闭、重新打开窗口dev_close_window()d
4、ev_open_window(0,0,Width/2,Height/2,black,WindowID)*设置输出窗口颜色为红色dev_set_color(red)*计算图像的灰度直方图gray_histo(Image,Image,AbsoluteHisto,RelativeHisto)*从直方图中确定灰度值阈值histo_to_thresh(RelativeHisto,8,MinThresh,MaxThresh)*设置区域显示的颜色数目dev_set_colored(12)*根据计算得到的MinThresh、MaxThresh进行阈值分割,并显示区域threshold(Image,Region
5、,MinThresh,MaxThresh)*显示区域dev_display(Region)根据直方图谷底确定阈值分割实例(a)原图(b)阈值分割结果图程序执行结果如图所示:程序执行结果如图所示:有时手动设定阈值并不是一个严谨的方法,因为人对图像灰度的感受并不精准,即使对同一场景,当光线有微妙变化时,灰度也会有差异。在连续采集的图像中,图像的灰度也是动态变化的,环境光照、拍摄角度等因素都会影响图像的灰度。如果阈值是一个固定的值,那么在处理连续图像时结果会不够准确。因此,可以使用自适应阈值进行调节。自适应阈值是一种基于直方图的阈值。其原理是,以灰度直方图中出现的谷底为分割点,对灰度直方图的波峰进行
6、分割。因此,有多少个波峰,就会分割出多少个区域。实验法在Halcon中进行自适应阈值处理算子如下:基于直方图的自动阈值分割实例 程序执行结果如图所示:(a)原图(b)阈值分割结果图 程序如下:read_image(Aegypt1,egypt1)auto_threshold(Aegypt1,Regions,4)dev_display(Regions)它适用于一些无法用单一灰度进行分割的情况,如背景灰度比较复杂,有的部分比前景目标亮,有的部分比前景目标暗;又如前景目标包含多种灰度,因而无法用全局阈值完成分割。该算子利用邻域,通过局部灰度对比,找到一个合适的阀值进行分割。dyn_threshold算
7、子的应用步骤一般分三步:,读取原始图像;,使用平滑滤波器对原始图像进行适当平滑;,使用dyn_threshold算子比较原始图像与均值处理后的图像局部像素差异,将差异大于设定值的点提取出来。局部阈值分割法程序如下:*关闭窗口dev_close_window()*获取图像read_image(Image,photometric_stereo/embossed_01)*获得图像尺寸get_image_size(Image,Width,Height)*打开适应图像大小的窗口dev_open_window(0,0,Width,Height,black,WindowHandle1)*在图像上使用均值滤波
8、器进行适当平滑 mean_image(Image,ImageMean,59,59)*动态阈值分割,提取圆区域dyn_threshold(Image,ImageMean,RegionDynThresh,15,not_equal)*显示图像dev_display(Image)*显示提取区域dev_display(RegionDynThresh)局部阈值分割算子dyn_threshold实例(a)原图(b)dyn_threshold阈值分割结果程序执行结果如图所示:程序执行结果如图所示:区域分割区域分割 一幅图像中属于同一区域的像素一般具有相同或相似的属性,区域分割通过利用的是图像该性质进行划分,使
9、具有相同像素的像素归属同一区域,不同属性的像素归属不同区域。传统的区域分割方法有区域生长和区域分裂与合并,其中最基础的是区域生长法。区域生长法区域生长法的基本思想是将一幅图像分成许多小的区域,并将具有相似性质的像素集合起来构成区域。具体来如下:在图像上选定一个“种子”像素或者“种子”区域;从“种子”的邻域像素开始搜寻,将种子像素周围邻域中与种子像素有相同性质或相似性质的像素(根据某种事先确定的生长或相似准则来判断)合并到种子像素所在的区域中;进一步将这些新像素作为新的种子像素继续进行上述操作,直到再没有满足条件的像素可被包括进来为止,图像分割随之完成。区域生长法思想很简单,只需要若干种子点即可
10、将具有相同特征的联通区域分割出来。在生长过程中的生长准则可以自由的指定,同时可以在同一时刻挑选多个准则。tp区域生长法、区域生长法的过程如果以灰度分布相似性作为生长准则来决定合并的区域,则需要比较邻接区域的累积直方图并检测其相似性,过程如下:(1)把图像分成互不重叠的合适小区域;(2)比较各个邻接小区域的累积灰度直方图。柯尔莫哥洛夫-斯米诺夫检测:平滑差分检测:TzhzhR21max zTzhzh21区域生长法2、在Halcon中区域生长法的算子在Halcon中区域生长法的算子如下:该算子指明了开始进行区域生长算法的点(x,y)的坐标,并以指定的点为中心,不断搜索其邻域,寻找符合设定条件的区域
11、。这里的条件有两种,一是区域边缘的灰度值与当前均值图中对应的灰度值的差小于Tolerance 参数的值;二是区域包含的像素数应大于MinSize参数的值。程序如下:*读取图像read_image(Image,fabrik)*对图像进行均值处理,选用circle类型的中值滤波器median_image(Image,ImageMedian,circle,2,mirrored)*使用regiongrowing算子寻找颜色相近的邻域regiongrowing(ImageMedian,Regions,1,1,2,5000)*对图像进行区域分割,提取满足各个条件的各个独立区域shape_trans(Reg
12、ions,Centers,inner_center)connection(Centers,SingleCenters)*计算出初步提取的区域的中心点坐标area_center(SingleCenters,Area,Row,Column)*以均值灰度图像为输入,进行区域增长计算,计算的起始坐标为上一步的各区域中心 regiongrowing_mean(ImageMedian,RegionsMean,Row,Column,25,100)区域生长法实例(a)原图(b)regiongrowing 执行结果程序执行结果如图所示:程序执行结果如图所示:()regiongrowing-mean 执行结果区域
13、分裂合并法当事先完全不了解区域形状和区域数目时,可采用分裂合并法。从上面图像分割的方法中了解到,图像阈值分割法可以认为是从上到下(从整幅图像根据不同的阈值分成不同区域)对图像进行分开,而区域生长法相当于从下往上(从种子像素开始不断接纳新像素最后构成整幅图像)不断对像素进行合并。如果将这两种方法结合起来对图像进行划分,便是分裂合并算法。因此,其实质是先把图像分成任意大小而且不重叠的区域,然后再合并或分裂这些区域以满足分割的要求。分裂合并算法是基于四叉树思想,下面先对四叉树进行简单介绍。区域分裂合并法.四叉树令R表示整幅图像区域,并选择一个属性Q。对R进行分割的一种方法是依次将它细分为越来越小的四
14、象限区域,以便对于任何区域 有,从整个区域开始,如果 ,则将该区域再次细分为四个子象限区域,以此类推。四叉树原理图四叉树原理图如图所示:iRTRUERQi)(FALSERQ)((a)被分割的图像 (b)对应的四叉图区域分裂合并法前述讨论可以小结为如下过程:对 满足的任何区域,分裂为4个不相交的象限区域。当不可能进一步分裂时,对满足 条件的任意两个邻接区域 和 进行聚合。当无法进一步聚合时,终止算法。FALSERQi)(iRTRUERRQkj)(jRkR区域分裂合并法2.利用四叉树进行图像分割在图像四叉树分割时,需要用到图像区域内和区域间的均一性。均一性准则是区域是否合并的判断条件,可以选择的形
15、式有:区域中灰度最大值与最小值的方差小于某选定值;两区域平均灰度之差及方差小于某选定值;两区域的纹理特征相同;两区域参数统计检验结果相同;两区域的灰度分布函数之差小于某选定值。区域分裂合并法2.利用四叉树进行图像分割利用这些“一致性谓语”实现图像分割的基本过程如下:初始化:生成图像的四叉树数据结构。合并:根据经验和任务需要,从四叉树的某一层开始,由下向上检测每一个结点的一致性准则。分裂:考虑上一步不能合并的子块,如果它的子结点不满足一致性准则,将这个结点 永久地分为4个子块。由于人为地将图像进行四叉树分解,可能会将同一区域的像素分在不能按照四叉树合并的子块内,因此需要搜索所有的图像块,将邻近的
16、未合并的子块合并为一个区域。由于噪声影响或者按照四叉树划分边缘未对准,进行上述操作后可能仍存在大量的小区域,为了消除这些影响,可以将它们按照相似性准则归入邻近的大区域内。边缘检测边缘检测 边缘是指图像中像素灰度有阶跃变化或屋顶状变化的那些像素的集合。它包含了丰实的信息,是图像识别中抽取的重要属性。边缘检测是图像处理和计算机视觉中的基本问题,因此,我们需要理解边缘检测的相关知识。边缘检测和区域划分是图像分割的两种不同的方法,二者具有相互补充的特点。从数学上看,图像的模糊相当于图像被平均或积分,为实现图像的锐化,必须用它的反运算“微分”加强高频分量作用,使轮廓清晰。边缘检测原理梯度对应一阶导数,对
17、于一个连续图像函数 ,梯度矢量定义为:梯度的幅度为:梯度的方向为:TTyxyfxfGGyxf,2/122,yxGGyxfmagyxfxyGGyxarctan,yxf,边缘检测的一般流程如下:获取图像。选择感兴趣区域。这是为了减少计算量,加快处理速度。图像滤波。对输入图像使用边缘滤波器是采集后的一个关键步骤。提取边缘。将符合条件的边缘提取出来,应用滤波器之后,可以使用阈值处理将图像中的高亮边缘提取出来。边缘处理。根据检测的需要对提取出的边缘进行处理。显示结果。将结果绘制在窗口中,以表现直观的边缘提取效果。边缘检测原理Roberts算子利用局部差分算子寻找边缘,边缘定位较准,但容易丢失一部分边缘,
18、同时由于图像没有经过平滑处理,因此不具有抑制噪声的能力。该算子对具有陡峭边缘且含噪声少的图像处理效果较好。称为Roberts交叉算子。在实际应用中为简化计算,用梯度函数的Roberts绝对值来近似:用卷积模板表示为:,其中 和 由模板所示。Roberts边缘检测算子子111122yxfyxfyxfyxfyxG,yxG,1,11,1,yxfyxfyxfyxfyxGyxGGyxG,xGyG01-101001-0110*读取图像read_image(Image,fabrik)*用Roberts滤波器提取边缘roberts(Image,ImageRoberts,roberts_max)*进行阈值分割t
19、hreshold(ImageRoberts,Region,9,255)*进行区域骨骼化skeleton(Region,Skeleton)*显示图像dev_display(Image)*设置输出颜色为红色dev_set_color(red)*显示骨骼dev_display(Skeleton)5.2.1区域生长法实例(a)原图(b)阈值后程序执行结果如图所示:()边缘诡取并骨骼化Roberts边缘提取分割实例Prewitt和Sobel算子的方程完全一样,只是常量c=1,其卷积模板如图所示:由于常量c不同,这一算子与Sobel算子不同的地方在于没有把重点放在接近模板中心的像素点。当用两个掩模板(卷积
20、算子)组成边缘检测器时,通常取较大的幅度作为输出值,这使得它们对边缘的走向有些敏感。取它们的平方和的开方可以获得性能更一致的全方位的响应,这与真实的梯度值更接近。图像增强的点运算101-101-101-1110001-1-1-Prewitt边缘检测算子另一种方法是,可以将Prewitt以算子扩展成8个方向,即模板边缘算子,这些算子样板由理想的边缘子图构成。依次用边缘样板去检测图像,与被检测区域原图相似的样板给出最大值。用这个最大值作为算子的输出值,这样可将边缘像素检测出来。定义Prewitt边缘检测算子模板如图所示:Prewitt边缘检测算子模板1-1-11-2-1111yxP,1-1-1-1
21、2-11111-111-2-11-111111-2-11-1-111112-11-1-1-11112-1-11-1-111-12-1-111-11-1-12-1-1111-1-1-12-11111-111-2-11-111111-2-11-1-111112-11-1-1-1-1-1-12-11111-111-2-11-111111-2-11-1-111112-11-1-1-程序如下:*读取图像read_image(Image,fabrik)*用prewitt算子进行边缘提取prewitt_amp(Image,ImageEdgeAmp)*进行阈值操作threshold(ImageEdgeAmp,
22、Region,20,255)*骨骼化操作skeleton(Region,Skeleton)*显示图像dev_display(Image)*设置输出颜色为红色dev_set_color(red)*显示骨骼图像dev_display(Skeleton)5.2.1区域生长法实例(a)原图()阈值后程序执行结果如图所示:程序执行结果如图所示:()骨骼化Prewitt边缘提取实例(b)Prewitt边缘提取Kirsch算法由八个方向的模板决定,将的模板元素分别与当前像素点的模板区域的像素点相乘,然后选八个值中最大的值作为中央像素的边缘强度。其中:Kirsch算法70 KK70 KKTgggyxg,max
23、,10 1111,kliilykxflkKyxg*读取图像read_image(Image,fabrik)*用kirsch算子进行边缘检测kirsch_amp(Image,ImageEdgeAmp)*进行阈值操作threshold(ImageEdgeAmp,Region,70,255)*骨骼化操作skeleton(Region,Skeleton)*显示图像dev_display(Image)*设置输出颜色为红色dev_set_color(red)*显示骨骼图像dev_display(Skeleton)5.2.1区域生长法实例(a)原图()阈值后程序执行结果如图所示:程序执行结果如图所示:()骨
24、骼化Kirsch边缘提取实例(b)Kirsch边缘提取 程序如下:*关闭窗口dev_close_window()*获取图像read_image(Image,mreut)*获得图像大小get_image_size(Image,Width,Height)*打开与图像大小相适应的窗口dev_open_window(0,0,Width,Height,black,WindowID)*设置窗口的字体,14号字,Courier New字体,粗体set_display_font(WindowID,14,mono,true,false)*进行高斯-拉普拉斯变换laplace_of_gauss(Image,Ima
25、geLaplace,5)*通过提取高斯-拉普拉斯图像上的零交叉点进行边缘检测zero_crossing(ImageLaplace,RegionCrossing2)程序执行结果如图所示:程序执行结果如图所示:(a)原图 (b)高斯-拉普拉斯边缘提取图 高斯-拉普拉斯边缘提取实例()零交叉点边缘检测效果图Canny边缘检测算子是一种具有较好边缘检测性能的算子,利用高斯函数的一阶微分性质,把边缘检测问题转换为检测准则函数极大值的问题.能在噪声抑制和边缘检测之间取得较好的折中。一般来说,图像边缘检测必须能有效地抑制噪声,且有较高的信噪比,这样检测的边缘质量也越高。Canny边缘检测就是极小化由图像信噪
26、比和边缘定位精度乘积组成的函数表达式,得到最优逼近算子。与Marr的LOG边缘检测类似,Canny也属于先平滑后求导的方法。图像增强的点运算程序如下:*获取图像read_image(Image,fabrik)*使用canny算法进行边缘提取edges_image(Image,ImaAmp,ImaDir,lanser2,0.5,nms,12,22)*阈值分割threshold(ImaAmp,Edges,1,255)*骨骼化skeleton(Edges,Skeleton)*将骨骼化的区域转化为XLDgen_contours_skeleton_xld(Skeleton,Contours,1,filt
27、er)*显示图像dev_display(Image)*设置6种输出颜色dev_set_colored(6)*显示XLDdev_display(Contours)5.2.1区域生长法实例(a)原图()骨骼化程序执行结果如图所示:程序执行结果如图所示:()边缘轮廓显示Canny边缘提取分割实例(b)Canny边缘提取 一般描述图像的最基本的单位是像素,相机的分辨率也是以像素数量来计算的,像素越高,分辨率越大,图像越清晰。点与点之间的最小距离就是一个像素的宽度,但实际工程中可能会需要比一个像素宽度更小的精度,因此就有了亚像素级精度的概念,用于提高分辨率。Halcon 中用 XLD(eXtended
28、Line Descriptions)表示亚像素的轮廓和多边形。提取亚像素边缘常用的算子如下所示:关于边缘提取还要注意一点,当振幅大于低阈值、又小于高阈值的时候,判断此边缘点是否与已知边缘点相连,相连则认为该点是边缘点,否则不是边缘点。亚像素级别的边缘提取 程序如下:*关闭窗口dev_close_window()*读取图像read_image(Image,fabrik)*打开适应图像大小的窗口dev_open_window_fit_image(Image,0,0,-1,-1,WindowHandle)*对图像进行亚像素区域提取edges_sub_pix(Image,Edges,canny,2,1
29、2,22)*放大图像用于详细的边缘检查dev_set_part(160,250,210,300)dev_display(Image)dev_display(Edges)程序执行结果如图所示:程序执行结果如图所示:(a)原图 (b)边缘提取图 亚像素级别的边缘提取实例()局部边缘检查图H o u g h 变 换Hough 变换 理想情况下,前面讨论的方法应该只产生边缘上的像素。在实际中由于噪声和光照不均等因素,使得在很多情况下所获得的边缘点是不连续的。因此,典型的边缘检测算法遵循用链接过程把像素组装成有意义的边缘的方法。一种寻找并链接图像中线段的处理方式是Hough变换。在图像 坐标空间中,经过
30、的直线有无数条,这些线对某些a值和b值来说,均满足如果将和视为常数,而将原本的参数a和b视为变量,这样可对固定点 产生单独的一条,直线可表示为就变换到了参数平面a-b。考虑图像坐标空间的另一点,它在参数空间中也有相应的一条直线,表示为这条直线与点在参数空间的直线相交于一点,如图所示:直角坐标参数空间yxiiyx,baxyiiixiyiiyx,iiyaxbjjyx,jjyaxb直角坐标参数空间的实际困难是a(直线的斜率)接近无限大,也就是接近垂直方向。解决该困难的一种方法是使用直线的标准表达式,即:极坐标参数空间.sincosyxHough变换同样适用于方程已知的曲线检测。图像坐标空间的一条已知
31、的曲线方程也可以建立其相应的参数空间。由此,图像坐标空间中的一点,在参数空间中就可以映射为相应的轨迹曲线或者曲面。例如对于已知的圆方程,其直角坐标的一般方程为Hough变换可以检测某一任意形状边界的图形并且抗噪声能力强,能够在信噪比较低的条件下检测出直线或解析曲线。不过在进行变换前需要做二值化以及边缘检测等图像预处理工作,会损失掉原始图像中的许多信息。曲线检测222rbyaxHough变换图像分割实例程序如下:*读取图像 read_image(Image,fabrik)*获得目标区域图像rectangle1_domain(Image,ImageReduced,170,280,310,360)*
32、用Sobel边缘检测算子提取边缘sobel_dir(ImageReduced,EdgeAmplitude,EdgeDirection,sum_abs,3)*设置输出颜色为红色dev_set_color(red)*阈值分割得到图像threshold(EdgeAmplitude,Region,55,255)*截取图像 reduce_domain(EdgeDirection,Region,EdgeDirectionReduced)*进行Hough变换hough_lines_dir(EdgeDirectionReduced,HoughImage,Lines,4,2,mean,3,25,5,5,true
33、,Angle,Dist)*将霍夫变换提取直线以普通形式描述的输入行存储为区域gen_region_hline(LinesHNF,Angle,Dist)*显示图像dev_display(Image)*设置输出颜色数目dev_set_colored(12)*设置输出填充方式为“轮廓”dev_set_draw(margin)*显示LinesHNF dev_display(LinesHNF)*设置输出填充方式为“填充”dev_set_draw(fill)*显示Lines dev_display(Lines)直线检测Hough变换图像分割程序执行结果如图所示:变换图像分割程序执行结果如图所示:直线检测分
34、 水 岭 算 法分水岭算法 “分水岭”这个名字与一种地貌特点有关,它的思想是,把图像的灰度看作一张地形图,图像中的每一点像素的灰度值表示该点的海拔高度,高灰度值代表山脉,低灰度值代表盆地,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。分水岭算法能较好地适用于复杂背景下的目标分割,特别是具有蜂窝状结构的画面的内容分割。Halcon中使用watersheds算子提取图像的分水岭。该算子的原型如下:在Halcon中实现分水岭算法的算子如下:直接提取图像的盆地区域和分水岭区域算子如下:阈值化提取分水岭盆地区域算子如下:分水岭算法的基本认识程序如下:*获取图像read_image(
35、Br2,particle)*对单通道图像进行高斯平滑处理,去除噪声gauss_filter(Br2,ImageGauss,9)*将图像颜色进行反转invert_image(ImageGauss,ImageInvert)*对高斯平滑后的图像进行分数岭处理与阈值分割,提取出盆地区域watersheds(ImageInvert,Basins,Watersheds)watersheds_threshold(ImageInvert,Basins1,30)(a)原图()分水岭区域程序执行结果如图所示:程序执行结果如图所示:()分割后得到的盆地区域(b)原图反转 分水岭算法分割实例 小结 本章主要介绍了图像
36、分割的基本概念、公式推导以及适用情况。具体介绍了阈值分割、区域分割、边缘检测、Hough变换、分水岭算法这几种图像分割算法。我们需要虑实际问题的特殊性,根据不同的检测图像特征可以使用不同的方法。图像分割问题是一个十分困难的问题。因此,人们需要不断地进行学习,不断地探索使用新方法对图像进行处理,以得到预期的效果。本章讨论的方法都是实际应用中普遍使用的具有代表性的技术。本章小结5.1什么是图像分割?请举出三种图像分割的算法。5.2请简述利用区域生长法进行图像分割的过程。5.3请简述利用图像直方图确定图像阈值的图像分割方法。5.4边缘检测的理论依据是什么?请列举三种边缘检测算法。5.5什么是Hough变换?试述采用Hough变换检测直线的原理以及适用场合。5.6对下面的图像1采用简单区域增长法进行区域增长,给出灰度差值为T=1;T=2;T=3三种情况下的分割图像。习题