Halcon 图像分割 电脑版发表于:2024/5/8 14:15 ![](https://img.tnblog.net/arcimg/hb/0cebbc624ef24f6582d16debf7db6b30.png) >#Halcon 图像分割 [TOC] 边缘检测 ------------ ### 边缘检测简介 tn2>边缘是指图像中像素灰度有阶跃变化或屋顶状变化的那些像素的集合。 它包含了丰实的信息,是图像识别中抽取的重要属性。边缘检测是图像处理和计算机视觉中的基本问题,因此,我们需要理解边缘检测的相关知识 ### 边缘检测原理 tn2>边缘检测和区域划分是图像分割的两种不同的方法,二者具有相互补充的特点。 从数学上看,图像的模糊相当于图像被平均或积分,为实现图像的锐化,必须用它的反运算“微分”加强高频分量作用,使轮 廓清晰。 梯度对应一阶导数,对于一个连续图像函数f(x,y),梯度矢量定义为: ![](https://img.tnblog.net/arcimg/hb/796f8ddc0a524863817c0ee8a8cb0f47.png) tn2>梯度的幅度为: ![](https://img.tnblog.net/arcimg/hb/f42068a4cbde4a68b214489ccc040ec7.png) tn2>梯度的方向为: ![](https://img.tnblog.net/arcimg/hb/9ad4c22cd44c4e0b8ef0061a4c54b479.png) ### 边缘检测流程 tn2>边缘检测的一般流程如下: (1)获取图像。 (2)选择感兴趣区域。这是为了减少计算量,加快处理速度。 (3)图像滤波。对输入图像使用边缘滤波器是采集后的一个关键步骤。 (4)提取边缘。将符合条件的边缘提取出来,应用滤波器之后,可以使用阈值处理将图像中的 高亮边缘提取出来。 (5)边缘处理。根据检测的需要对提取出的边缘进行处理。 (6)显示结果。将结果绘制在窗口中,以表现直观的边缘提取效果。 ### Roberts算子 tn2>Roberts算子利用局部差分算子寻找边缘,边缘定位较准,但容易丢失一部分边缘,同时由于图像没有经过平滑处理,因此不具有抑制噪声的能力。 该算子对具有陡峭边缘且含噪声少的图像处理效果较好。 ![](https://img.tnblog.net/arcimg/hb/43ef83a49950483587e17ba1852b3249.png) tn2>G(x,y)称为Roberts交叉算子。在实际应用中为简化计算,用梯度函数的Roberts绝对值来近似: ![](https://img.tnblog.net/arcimg/hb/d3d6501b269e4bc295bae12e2bf7b532.png) tn2>用卷积模板表示为:![](https://img.tnblog.net/arcimg/hb/6af125ba4a5e4d9e8683065850684dd9.png),其中 和 由模板所示 ![](https://img.tnblog.net/arcimg/hb/7291eb350ead40daa69206c321512ef3.png) ### Roberts边缘提取分割实例 ```bash *读取图像 read_image (Image, 'fabrik') *用Roberts滤波器提取边缘 roberts (Image, ImageRoberts, 'roberts_max') *进行阈值分割 threshold (ImageRoberts, Region, 9, 255) *进行区域骨骼化 skeleton (Region, Skeleton) *显示图像 dev_display (Image) *设置输出颜色为红色 dev_set_color ('red') *显示骨骼 dev_display (Skeleton) ``` ![](https://img.tnblog.net/arcimg/hb/0145343a025d45bd93e71dd5fcf5ea55.png) ![](https://img.tnblog.net/arcimg/hb/f0be72ea8f7944bdb5dd503cf5f35c9f.png) ![](https://img.tnblog.net/arcimg/hb/00e2a931a2244f249e6c0f31e262c13b.png) ![](https://img.tnblog.net/arcimg/hb/5738cb4ca8ee4611a26a95bc78099912.png) ### 拉普拉斯边缘提取实例 ```bash *关闭窗口 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, ImageLaplace, 5) *通过提取高斯-拉普拉斯图像上的零交叉点进行边缘检测 zero_crossing (ImageLaplace, RegionCrossing2) ``` ![](https://img.tnblog.net/arcimg/hb/fe6833eb0b164fbf8fc90a1bb53df6fc.png) ![](https://img.tnblog.net/arcimg/hb/38908fdaaca24c7cbb9e075acc329022.png) 阈值分割 ------------ tn2>阈值分割法是一种基于区域的图像分割技术,它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤。 阈值分割法是一种传统的最常用的图像分割方法,特别适用于目标和背景占据不同灰度级范围的图像。 ### 根据直方图谷底确定阈值法 tn2>如果图像由暗色背景上得较亮物体组成,以这样组成方式的图像的灰度直方图具有明显谷底,从背景中提取物体的一种很明显的方法就是选择两峰之间的谷底对应的灰度值T作为阈值进行图像分割。 T值的选取如图所示: ![](https://img.tnblog.net/arcimg/hb/c8a827ffd2df490298ac9c3030ba8adf.png) ```bash *读取图像 read_image (Image, 'letters') *获得图像尺寸 get_image_size (Image, Width, Height) *关闭、重新打开窗口 dev_close_window () dev_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, MinThresh, MaxThresh) threshold (Image, Region, MinThresh[0], MaxThresh[0]) *显示区域 dev_display (Region) ``` ![](https://img.tnblog.net/arcimg/hb/df19a4050d664a0a989835b26ac74bd4.png) ### 基于直方图的自动阈值分割实例 tn2>在Halcon中进行自适应阈值处理算子如下: `auto_threshold(Image : Regions : Sigma : )` ```bash * 获取图像 read_image (Aegypt1, 'egypt1') * 自动阈值处理,阈值越小分的颜色越多 auto_threshold (Aegypt1, Regions, 5) * 显示 dev_display (Regions) ``` ![](https://img.tnblog.net/arcimg/hb/066b258e76bb4bc1ad280f00f85bf358.png) ### 局部阈值分割法 tn2>它适用于一些无法用单一灰度进行分割的情况,如背景灰度比较复杂,有的部分比前景目标亮,有的部分比前景目标暗; 又如前景目标包含多种灰度,因而无法用全局阈值完成分割。 该算子利用邻域,通过局部灰度对比,找到一个合适的阀值进行分割。<br/> `dyn_threshold`算子的应用步骤一般分三步: 1.读取原始图像 2.使用平滑滤波器对原始图像进行适当平滑 3.使用`dyn_threshold`算子比较原始图像与均值处理后的图像局部像素差异,将差异大于设定值的点提取出来。 ### 局部阈值分割算子dyn_threshold实例 ```bash *关闭窗口 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) *在图像上使用均值滤波器进行适当平滑 mean_image (Image, ImageMean, 59, 59) *动态阈值分割,提取圆区域 dyn_threshold (Image, ImageMean, RegionDynThresh, 15, 'not_equal') * 显示图像 dev_display (Image) *显示提取区域 dev_display (RegionDynThresh) ``` ![](https://img.tnblog.net/arcimg/hb/37753ea6b1d9424fa6421f39695b54d8.png) 区域分割 ------------ tn2>一幅图像中属于同一区域的像素一般具有相同或相似的属性,区域分割通过利用的是图像该性质进行划分,使具有相同像素的像素归属同一区域,不同属性的像素归属不同区域。 传统的区域分割方法有区域生长和区域分裂与合并,其中最基础的是区域生长法。 ### 区域生长法 tn2>区域生长法的基本思想是将一幅图像分成许多小的区域,并将具有相似性质的像素集合起来构成 区域。具体来如下: 首先在图像上选定一个“种子”像素或者“种子”区域 然后从“种子”的邻域像素开始搜寻,将种子像素周围邻域中与种子像素有相同性质或相似性质的像素(根据某种事先确定的生长或相似准则来判断)合并到种子像素所在的区域中; 最后进一步将这些新像素作为新的种子像素继续进行上述操作,直到再没有满足条件的像素可被包括进来为止,图像分割随之完成。<br/> 区域生长法思想很简单,只需要若干种子点即可将具有相同特征的联通区域分割出来。 在生长过程中的生长准则可以自由的指定,同时可以在同一时刻挑选多个准则。 ### 区域生长法的过程 tn2>如果以灰度分布相似性作为生长准则来决定合并的区域,则需要比较邻接区域的累积直方图并检 测其相似性,过程如下: (1)把图像分成互不重叠的合适小区域; (2)比较各个邻接小区域的累积灰度直方图。<br/> 柯尔莫哥洛夫-斯米诺夫检测: ![](https://img.tnblog.net/arcimg/hb/e77eb581483245259280dbf26fc0ec87.png) tn2>平滑差分检测: ![](https://img.tnblog.net/arcimg/hb/9c4632af9ea546d999358e61801efa1c.png) ### 在Halcon中区域生长法的算子 tn2>在Halcon中区域生长法的算子如下: ![](https://img.tnblog.net/arcimg/hb/7b65fb4630d049cc8bb0bd6271aea637.png) tn2>该算子指明了开始进行区域生长算法的点(x,y)的坐标,并以指定的点为中心,不断搜索其邻域,寻找符合设定条件的区域。 这里的条件有两种,一是区域边缘的灰度值与当前均值图中对应的灰度值的差小于Tolerance 参数的值;二是区域包含的像素数应大于MinSize参数的值。 ```bash *读取图像read_image (Image, 'fabrik') *对图像进行均值处理,选用circle类型的中值滤波器 median_image (Image, ImageMedian, 'circle', 2, 'mirrored') *使用regiongrowing算子寻找颜色相近的邻域 regiongrowing (ImageMedian, Regions, 1, 1, 2, 5000) *对图像进行区域分割,提取满足各个条件的各个独立区域 shape_trans (Regions, Centers, 'inner_center') connection (Centers, SingleCenters) *计算出初步提取的区域的中心点坐标 area_center (SingleCenters, Area, Row, Column) *以均值灰度图像为输入,进行区域增长计算,计算的起始坐标为上一步的各区 域中心regiongrowing_mean (ImageMedian, RegionsMean, Row, Column, 25, 100) ``` ![](https://img.tnblog.net/arcimg/hb/067209bf53dc436a8b1a879def9e596e.png)