《数字图像处理》-9 图像分割&halcon代码

图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。
在这里插入图片描述

1,点,线,边缘检测

1.1 点检测

将嵌在一幅图像的恒定区域或亮度几乎不变的区域里的孤立点的检测,就是点检测。可以用点检测的模板来将孤立的点检测出来:这个模板的作用就是当模板中心是孤立点时,模板的相应最强,而在非模板中心时,相应为零。
拉普拉斯模板:
在这里插入图片描述
对计算出来的点图像再进行阈值分割,即可需要的检测点。

read_image (Image, 'printer_chip/printer_chip_01')
laplace (Image, ImageLaplace, 'absolute', 3, 'n_8')
min_max_gray (ImageLaplace, ImageLaplace, 0, Min, Max, Range)
threshold (ImageLaplace, Region, Max*0.5, 255)
1.2 线检测

线检测也可以使用拉普拉斯二阶导数模板,但必须对二阶导数的双线性做适当的处理。二阶导数的双线性效应:二阶导数会在灰度斜坡和灰度台阶过渡处会产生双边缘效应。拉普拉斯算子是各向同性的。

采用线检测模板
在这里插入图片描述
同样的,当检测的线是在中间那行或者是由“2”组成的行或列中,则此时的相应最大,其他部分的相应较小。

1.3 基本边缘检测

二阶函数的梯度向量公式
在这里插入图片描述

这个向量的幅值可以简化为如下形式:通常使用梯度的幅值或近似值来作为“梯度”。
在这里插入图片描述
采用这个简化是因为当边缘时水平或竖直情况下,该值不发生改变。
梯度向量的基本性质是:梯度向量指向(x,y)坐标处f的最大变化率方向。
最大变化率处发生的角度是:
在这里插入图片描述

1.3.1 prewitt边缘检测

在这里插入图片描述

prewitt_amp (Image, ImageEdgeAmp)
1.3.2 roberts交叉检测算子

在这里插入图片描述

roberts (ImageEdgeAmp, ImageRoberts1, 'gradient_max')
1.3.3 sobel检测算子

在这里插入图片描述

sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
1.3.4 LoG检测算子

在这里插入图片描述
这个公式表示的是平滑函数。如果此函数和图像进行卷积,则图像会变得模糊,且模糊的程度是由σ决定的。这个函数的拉普拉斯算法是:
在这里插入图片描述
这个函数称为LoG算子。原理是:由于求二阶导数是线性操作,所以用这个函数卷积这幅图像与先用平滑函数对图像卷积,再对结果进行拉普拉斯计算的结果是一样的。
在这里插入图片描述
LoG边缘检测算法步骤:
  1.平滑:高斯滤波器
  2.增强:Laplacian算子计算二阶导
  3.检测:二阶导零交叉点并对应于一阶导数的较大峰值
  4.定位:线性内插

1.3.5 canny边缘检测

Canny检测算子
这种算子是edge函数中最强的边缘检测算子:
(1)图像用指定了标准差σ的高斯滤波器来平滑,用来减少噪声;
(2)局部梯度和边缘方向在每个点都进行计算。边缘点被定义为梯度方向上局部强度最大的点。
(3)在(2)中决定的边缘点在梯度幅度图像上给出脊。然后算法追踪所有脊的顶部,设置所有的不在脊的顶部的像素为零。因此在输出中给出一条细线,这是非最大值抑制处理。脊像素使用称为“滞后阈值”的技术进行阈值处理,这种技术以使用两个阈值为基础,即T1和T2,且T1<T2。值大于T2的脊像素称为强边缘像素,T1和T2之间的脊像素称为弱边缘像素。
(4)算法用合并8连接的弱像素点到强像素点的方法执行边缘连接
其中非极大值抑制细化了幅值图像中的屋脊带,只保留幅值局部变化最大的点。
 双阈值算法:用两个阈值得到两个阈值图像,然后把高阈值的图像中的边缘连接成轮廓,连接时到达轮廓的端点时,在低阈值图像上找可以连接的边缘。不断收集,直到所有的间隙连接起来为止。
 在这里插入图片描述
在这里插入图片描述

1.3.6 霍夫变换
read_image (Image, 'fabrik')
rectangle1_domain (Image, ImageReduced, 230, 180, 330, 280)
* Detect edges (amplitude) using the Sobel operator
sobel_amp (ImageReduced, EdgeAmplitude, 'thin_sum_abs', 3)
dev_set_color ('red')
threshold (EdgeAmplitude, Region, 60, 255)
hough_lines (Region, 8, 40, 15, 15, Angle, Dist)
dev_set_color ('blue')
* Store input lines described in HNF
gen_region_hline (Regions, Angle, Dist)

https://www.cnblogs.com/php-rearch/p/6760683.html

3 阈值处理

3.1 基础知识

一般情况下,一张图片分为前景和背景,我们感兴趣的一般的是前景部分,所以我们一般使用阈值将前景和背景分割开来,使我们感兴趣的图像的像素值为1,不感兴趣的我0,有时一张图我们会有几个不同的感兴趣区域(不在同一个灰度区域),这时我们可以用多个阈值进行分割,这就是阈值处理。
单个阈值:
在这里插入图片描述
在这里插入图片描述

3.2 迭代法

1 针对全局阈值选择初始估计值T;
2 用T分割图像,G1是所有灰度值大于T的像素组成,G2是所有灰度值小于等于T的像素组成;
3 分别计算G1和G2区域内的平均灰度值m1和m2;
4 计算出新的阈值,取他们的m1和m2平均值数;
5 重复步骤2.-4.,直到在连续的重复中,T的差异比预先设定的参数小为止;

read_image (Image, 'printer_chip/printer_chip_01')
star:=0
for Index := 1 to 1000 by 1
    if (Index==1)
        intensity (Image, Image, Mean, Deviation)
        star:=Mean
    endif
    threshold (Image, Region, star, 255)
    intensity (Region, Image, MeanBig, Deviation1)
    complement (Region, RegionComplement)
    intensity (RegionComplement, Image, MeanSmall, Deviation2)
    newValue:=(MeanBig+MeanSmall)/2
    if (newValue-star<5)
        break
    endif
    star:=newValue
endfor

3.3 最大类间方差

理念:当取最佳阈值时,背景应该与前景差别最大,otsu算法中这个衡量差别的标准就是最大类间方差。
OTSU算法的假设是存在阈值TH将图像所有像素分为两类C1(小于TH)和C2(大于TH),则这两类像素各自的均值就为m1、m2,图像全局均值为mG。同时像素被分为C1和C2类的概率分别为p1、p2。因此就有:
p1m1+p2m2=mG
p1+p2=1

根据方差的概念,类间方差表达式为:
在这里插入图片描述
我们把上式化简,将式(1)代入式(3),可得:
在这里插入图片描述
其中
在这里插入图片描述

read_image (Image, 'printer_chip/printer_chip_01')
*第一种,
binary_threshold (Image, Region, 'max_separability', 'light', UsedThreshold)
*算法验证
ostu:=[]
area_center (Image, Area0, Row2, Column2)
for TH := 0 to 255 by 1
    *区域分割
    threshold (Image, Region3, TH, 255)
    *获得前景区域像素个数
    area_center (Region3, Area, Row, Column)
    *获得前景区域均值和方差
    intensity (Region3, Image, Mean, Deviation)
     *获得背景区域像素个数,均值和方差
     complement (Region3, RegionComplement)
     area_center (RegionComplement, Area1, Row1, Column1)
     intensity (RegionComplement, Image, Mean1, Deviation1)
     value:=Area*1.0/Area0*Area1*1.0/Area0*pow(Mean-Mean1,2)
     ostu:=[ostu,value]
endfor
tuple_sort_index (ostu, Indices)
threValue:=Indices[255]

算法评价:

就最大类间方差算法而言,优点是算法简单,当目标与背景的面积相差不大时,能够有效地对图像进行分割。但是,当图像中的目标与背景的面积相差很大时,表现为直方图没有明显的双峰,或者两个峰的大小相差很大,分割效果不佳,或者目标与背景的灰度有较大的重叠时也不能准确的将目标与背景分开。导致这种现象出现的原因是该方法忽略了图像的空间信息,同时该方法将图像的灰度分布作为分割图像的依据,因而对噪声也相当敏感。所以,在实际应用中,总是将其与其他方法结合起来使用。

3.4 使用图像平滑改进全局阈值处理

全局阈值处理对噪声敏感,噪声可以影响阈值的选择,当噪声不能够在源头减少,在阈值处理之前可以将图像进行平滑处理,这样可以更好地进行阈值处理。

3.5使用边缘改进全局阈值处理

边缘改进的阈值处理:主要是处理那些位于或接近物体和背景间边缘的像素,使得这些像素分离开的操作。
具体算法过程如下:
1 用一种边缘查找方式计算图像的模板的值。
2 通过百分比指定阈值。由于计算的边缘模板值中有很多噪声,所以可以将计算值排序,并选择百分比相对高的值(大于百分下的值的阈值)作为阈值。
3 根据指定的阈值,对第一步的图像边缘的值进行选择。使高于阈值的像素点值为1,低于的值为零,由此选择出部分边缘点的二值图像(模板)。
4用刚才计算出来的模板与原图像相乘,获得一幅新的图像。
对新的图像使用otsu进行分割。

4 基于区域的分割

区域生长(region growing) 是指将成组的像素或区域发展成更大区域的过程。从种子点的集合开始,从这些点的区域增长是通过将与每个种子点有相似属性像强度、灰度级、纹理颜色等的相邻像素合并到此区域。
在区域生长中的主要问题如下:
1.选定代表所需区域的种子像素
2.确定相似性准则即生长准则
3.制定让生长过程停止的法则

read_image (Image, 'printer_chip/printer_chip_01')
laplace (Image, ImageLaplace, 'absolute', 3, 'n_8')
min_max_gray (ImageLaplace, ImageLaplace, 0, Min, Max, Range)
threshold (ImageLaplace, Region, Max*0.5, 255)
connection (Region, ConnectedRegions)
area_center (ConnectedRegions, Area, Row, Column)
regiongrowing_mean (Image, Regions, Row, Column, 10, 100)

5 分水岭

分水岭算法基本思想:

一个灰度影像可以看做一个高程影像,灰度的变化就是地形的起伏。假设向该区域不断注水,则地势较低的位置会首先被淹没,随着水位的升高淹没的区域也会不断提高,而初始位置称为集水盆。而分水岭算法就是基于此基本思想,首先假设图像灰度值为高度值,通过集水盆区域不断注水使得每个淹没区域不断扩大,而当水淹没到一定高度时两个集水盆会相连合并为同一个区域,此时就应该在这两个集水盆之间建立拦水坝以阻止区域的合并,持续次过程直到注水高度满足要求得到所有集水盆的淹没区域。

分水岭算法主要用于图像的分割,如果目标物体是连接在一起的,则分割起来会很困难。此时经常采用分水岭分割算法,会得到比较好的效果。分水岭分割算法把图像看成一幅地形图,亮度比较强的区域像素值较大,亮度暗的区域像素值比较小,通过寻找汇水盆地和分水岭界线对图像进行分割。分水岭的计算过程是一个迭代标注过程。分水岭比较经典的计算方法是L. Vincent提出的。在该算法中,分水岭计算分两个步骤,一个是排序过程,一个是淹没过程。首先对每个像素的灰度级进行从低到高排序,然后在从低到高实现淹没过程中,对每一个局部极小值在h阶高度的影响域采用先进先出(FIFO)结构进行判断及标注。

1)使用梯度的分水岭分割

梯度处理是在分水岭变换之前的预处理,它将沿着物体的边缘有较高的像素值,而在其他地方的像素值比较低。

read_image (ImageLogo, 'mvtec_logo.png')
gauss_filter (ImageLogo, ImageGauss, 9)
sobel_amp (ImageGauss, EdgeAmplitude, 'sum_abs', 3)
watersheds_threshold (EdgeAmplitude, Basins2, 14)
2)使用距离变换的分水岭分割

最常用的分水岭变换分割的是距离变换,主要是用于二值图像的处理,它是指从每个像素到最接近零值的像素的距离。
分水岭的主要目的是将相连接的物体分割开来。

dev_set_draw ('margin')
dev_set_colored (12)
read_image (Image, 'C:/Users/luguoping/Desktop/001.bmp')
dev_close_window ()
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
threshold (Image, Region,0, 125)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20, 999990)
dev_display (Image)
dev_display (SelectedRegions)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
distance_transform (SelectedRegions, DistanceImage, 'octagonal', 'true', 544, 472)
convert_image_type (DistanceImage, DistanceImageByte, 'byte')
invert_image (DistanceImageByte, DistanceImageInv)
scale_image_max (DistanceImageInv, DistanceImageInvScaled)
watersheds_threshold (DistanceImageInv, Basins, 3)
dev_display (DistanceImageInvScaled)
dev_display (Basins)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
dev_display (Image)
dev_display (SelectedRegions)
dev_set_color ('blue')
dev_display (Basins)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
intersection (Basins, SelectedRegions, SegmentedPellets)
dev_display (Image)
dev_set_colored (12)
dev_display (SegmentedPellets)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
return ()

参考:
1https://blog.csdn.net/weixin_40647819/article/details/90179953
2https://www.cnblogs.com/xiaomanon/p/4110006.html
3https://blog.csdn.net/mary_0830/article/details/89597672
4https://blog.csdn.net/cuhinzozfi/article/details/90692924

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值