Halcon_图像分割

文章目录


一、阈值分割

阈值分割法是一种基于区域的图像分割技术,它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤。阈值分割法是一种传统的最常用的图像分割方法,特别适用于目标和背景占据不同灰度级范围的图像。

阈值分割三步:

  1. 确认阈值

    如果图像由暗色背景上得较亮物体组成,以这样组成方式的图像的灰度直方图具有明显谷底,从背景中提取物体的一种很明显的方法就是选择两峰之间的谷底对应的灰度值T作为阈值进行图像分割。

  2. 将阈值与像素灰度进行比较

  3. 把像素分类

1.计算图像阈值直方图-gray_histo

cpp 复制代码
算子:
gray_histo(区域, Image : : : AbsoluteHisto, RelativeHisto)
作用:
用于计算图像在指定区域内的灰度值的绝对和相对直方图。
参数:
Regions: 是要计算直方图的区域。
Image: 是要计算其灰度值分布的图像。
AbsoluteHisto 和 RelativeHisto: 是输出的直方图,分别表示绝对和相对频率

2.确认阈值- histo_to_thresh

cpp 复制代码
算子:
histo_to_thresh( : : Histogramm, Sigma : MinThresh, MaxThresh) 
作用:
用于从灰度直方图中确定灰度值阈值。这个算子的目的是通过分析直方图来自动选择一个或多个阈值。
参数:
Histogram :是输入的灰度直方图。
Sigma :是用于高斯平滑直方图的标准差参数。
MinThresh 和 MaxThresh: 是输出的最小和最大阈值。

3.像素分类 - threshold

cpp 复制代码
算子:
threshold(Image : 区域 : MinGray, MaxGray : )
作用:
用于根据指定的阈值对图像进行二值化处理。这个算子将图像中的像素分为两类:高于或等于阈值的像素和低于阈值的像素。
参数:
Image: 是要进行阈值处理的输入图像。
Region: 是输出的二值化区域。
ThresholdMin 和 ThresholdMax: 是阈值范围。像素值在这个范围内的像素将被视为前景

4.自动阈值分割

cpp 复制代码
算子:
auto_threshold(Image : 区域 : Sigma : )
作用:
用于根据图像的灰度直方图自动确定阈值并分割图像。
参数:
Image: 是输入的单通道图像。
Regions: 是输出的分割区域。
Sigma: 是用于直方图高斯平滑的标准差参数。较大的 Sigma 值会导致提取的区域更少

5.样例代码:

通过阈值直方图进行图像分割

csharp 复制代码
read_image(Image,'letters')
dev_open_window_fit_image(Image, 0, 0, -1, -1, WindowHandle)
rgb1_to_gray(Image, GrayImage)
*计算灰度直方图
gray_histo(Image,Image,AbsoluteHisto, RelativeHisto)
histo_to_thresh(RelativeHisto,8,MinThresh, MaxThresh)
threshold(GrayImage, Region, MinThresh[0], MaxThresh[0])

通过自动阈值分割

cpp 复制代码
read_image(Image,'letters')
dev_open_window_fit_image(Image, 0, 0, -1, -1, WindowHandle)
rgb1_to_gray(Image, GrayImage)
auto_threshold(GrayImage, Regions, 8)

6.区域生长

cpp 复制代码
算子:
regiongrowing

二、区域分割

它适用于一些无法用单一灰度进行分割的情况,如背景灰度比较复杂,有的部分比前景目标亮,有的部分比前景目标暗;又如前景目标包含多种灰度,因而无法用全局值完成分割。该算子利用邻域,通过局部灰度对比,找到一个合适的阀值进行分割。

局部阈值分割三步:

  1. 读原始图像
  2. 使用平滑滤波器对原始图像进行适当平滑
  3. 使用dyn_threshold算子比较原始图像与均值处理后的图像局部像素差异,将差异大于设定之的点提取出来。

1.局部阈值分割图像 - dyn_threshold

cpp 复制代码
算子:
dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )
作用:
通过比较原始图像和阈值图像的像素值来选择满足阈值条件的区域
参数:
OrigImage (input_object):原始图像。
ThresholdImage (input_object):处理后的图像,通常通过滤波处理得到。
RegionDynThresh (output_object):分割后的区域。
Offset (input_control):灰度值偏移量,通常取值5~40。
LightDark (input_control):提取区域类型,可选值为 'dark', 'equal', 'light', 'not_equal'

样例代码:

cpp 复制代码
read_image(Image,'photometric_stereo/embossed_01')
mean_image(Image, ImageMean, 59, 59)//均值平滑
dyn_threshold(Image, ImageMean, RegionDynThresh, 15, 'not_equal')

2.区域生长法

  • 选择合适的种子
  • 确定区域生长准则
  • 确认区域生长的终止条件
cpp 复制代码
regiongrowing(Image : 区域 : RasterHeight, RasterWidth, Tolerance, MinSize : )
RasterHeight:测试两像素的垂直的距离
RasterWidth:测试两像素的水平的距离
Tolerance:容差值,被测点和种子点的灰度差值要小于当前值
MinSize:区域最小大小

regiongrowing_mean(Image : 区域 : StartRows, StartColumns, Tolerance, MinSize : )
StartRows:区域生长起始的行坐标集合,指定从图像哪几行开始生长。
StartColumns:区域生长起始的列坐标集合,对应行坐标确定起始像素点位置。
Tolerance:生长时判断像素是否符合合并条件的相似性阈值。
MinSize:最终保留区域需达到的最小尺寸,小于此尺寸的区域会被舍弃。


二者区别:
regiongrowing是没有起始点的区域生长
regiongrowing是有起始点的区域生长
条件:
1.区域边缘的灰度与当前均值图中对应的灰度的差小于Tolerance参数的值
2.区域包含的像素数应大于MinSize参数的值

样例代码

cpp 复制代码
read_image(Image,'fabrik')
median_image(Image, ImageMedian, 'circle', 1, 'mirrored')
regiongrowing(ImageMedian, Regions, 1, 1, 2, 5000)

*区域分割
*找区域中心 inner-内部
shape_trans(Regions,Centers, 'inner_center')
*分离区域
connection(Centers,SingleCenters)

*计算出初步提取的区域的中心点坐标
area_center(SingleCenters, Area, Row, Column)

regiongrowing_mean(ImageMedian, Regions1, Row, Column, 25, 100)
connection(Regions1, ConnectedRegions)

三、边缘检测

1.边缘提取

sobel_amp

cpp 复制代码
算子:
sobel_amp(Image : EdgeAmplitude : FilterType, Size : )
作用:检测图像的边缘(幅度)
参数:
Image (输入对象):输入图像。
EdgeAmplitude (输出对象):边缘振幅(梯度幅度)图像。
FilterType (输入控制):滤波器类型。默认值为 'sum_abs'。其他可选值包括 'sum_abs_binomial','sum_sqrt',
'sum_sqrt_binomial', 'thin_max_abs', 'thin_max_abs_binomial', 'thin_sum_abs',
 'thin_sum_abs_binomial',  'x', 'x_binomial', 'y', 'y_binomial' 等。

其他的看文档

样例代码:

cpp 复制代码
read_image(Image, 'fabrik')
sobel_amp(Image, EdgeAmplitude, 'sum_abs', 3)
threshold(EdgeAmplitude, Region, 10, 255)
skeleton(Region, Skeleton)

roberts

cpp 复制代码
算子:
roberts(Image : ImageRoberts : FilterType : )
作用:
用于使用Roberts滤波器检测图像边缘
参数:
Image:输入参数,表示输入图像。
ImageRoberts:输出参数,表示输出图像。
FilterType:输入参数,表示角点导数的计算方式。可选值包括 'gradient_max'、'gradient_sum' 和 'roberts_max'

样例代码:

cpp 复制代码
read_image(Image, 'fabrik')
roberts(Image, ImageRoberts, 'gradient_sum')
threshold (ImageRoberts, Regions, 21, 255)
skeleton(Regions, Skeleton)

prewitt_amp

cpp 复制代码
算子:
prewitt_amp(Image : ImageEdgeAmp : : )
作用:
检测图像边缘的振幅
参数:
Image:输入参数,表示输入图像。
ImageEdgeAmp:输出参数,表示输出的边缘振幅图像。

样例代码:

cpp 复制代码
read_image(Image, 'fabrik')
prewitt_amp(Image, ImageEdgeAmp)
threshold(ImageEdgeAmp, Region, 10, 255)
skeleton(Region, Skeleton)

kirsch_amp

cpp 复制代码
算子:
kirsch_amp(Image : ImageEdgeAmp : : )
作用:
于使用Kirsch算子计算图像的边缘振幅。
参数:
Image:输入参数,表示输入图像。
ImageEdgeAmp:输出参数,表示输出的边缘振幅图像。

样例代码:

cpp 复制代码
read_image(Image, 'fabrik')
kirsch_amp(Image, ImageEdgeAmp1)
threshold (ImageEdgeAmp1, Regions, 74, 255)
skeleton(Regions, Skeleton)

高斯-拉普拉斯 laplace_of_gauss

cpp 复制代码
算子:
laplace_of_gauss(Image : ImageLaplace : Sigma : )
作用:
结合了高斯滤波和拉普拉斯算子的优点,用于边缘检测。
参数:
Image:输入参数,表示输入图像。
ImageLaplace:输出参数,表示经过拉普拉斯滤波的图像。
Sigma:输入参数,表示高斯滤波的平滑系数。默认值为2.0,建议值包括0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 7.0等。Sigma的取值范围为0.01 ≤ Sigma ≤ 25.0

样例代码:

cpp 复制代码
read_image(Image, 'fabrik')
laplace_of_gauss(Image, ImageLaplace, 2)
zero_crossing(ImageLaplace, RegionCrossing)

边缘提取 - edges_image

cpp 复制代码
算子:
edges_image(Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : )
作用:
用于提取图像的边缘。
参数:
Image:输入参数,表示输入图像。
ImaAmp:输出参数,表示边缘振幅(梯度大小)图像。
ImaDir:输出参数,表示边缘方向图像。
Filter:输入参数,表示要应用的边缘算子。可选值包括 'canny', 'deriche1', 'deriche1_int4', 'deriche2', 'deriche2_int4', 'lanser1', 'lanser2', 'mshen', 'shen', 'sobel_fast'
Alpha:输入参数,表示滤波器参数。小值导致强平滑,从而减少细节(对于Canny算子相反)。默认值为1.0,建议值包括0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1.1等。典型范围为 0.2 ≤ Alpha ≤ 50.0
NMS:输入参数,表示非极大值抑制。默认值为 'nms',可选值包括 'hvnms', 'inms', 'nms', 'none'
Low:输入参数,表示滞后阈值操作的低阈值(如果不需要阈值设置,则为负值)。默认值为20,建议值包括5, 10, 15, 20, 25, 30, 40等。典型范围为 1 ≤ Low ≤ 255
High:输入参数,表示滞后阈值操作的高阈值(如果不需要阈值设置,则为负值)。高阈值一般是低阈值的1.5-2倍

代码样例:

cpp 复制代码
read_image(Image, 'fabrik')
edges_image(Image, ImaAmp, ImaDir, 'canny', 1, 'nms', 12, 22)
threshold (ImaAmp, Regions, 1, 255)
skeleton(Regions, Skeleton)
*将骨骼化的区域转为XLD
gen_contours_skeleton_xld(Skeleton, Contours, 1, 'filter')

亚像素级别的边缘提取 - edges_sub_pix

cpp 复制代码
算子:
edges_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
作用:
用于提取图像的亚像素级别边缘。
参数:
Image:输入参数,表示输入图像。
Edges:输出参数,表示检测到的亚像素边缘轮廓。
Filter:输入参数,表示要应用的边缘检测算法。可选值包括 'canny', 'deriche1', 'deriche2', 'lanser1', 'lanser2', 'shen', 'mshen', 'sobel', 'sobel_fast' 等
Alpha:输入参数,表示高斯平滑系数。对于不同的滤波器,Alpha 的选择会影响滤波器的宽度和噪声抑制能力
Low:输入参数,表示滞后阈值操作的低阈值。用于确定边缘的低阈值。
High:输入参数,表示滞后阈值操作的高阈值。用于确定边缘的高阈值。

代码样例:

cpp 复制代码
read_image(Image, 'fabrik')
edges_sub_pix(Image, Edges, 'canny', 1, 12, 22)
相关推荐
音视频牛哥3 小时前
打通视频到AI的第一公里:轻量RTSP服务如何重塑边缘感知入口?
人工智能·计算机视觉·音视频·大牛直播sdk·机器视觉·轻量级rtsp服务·ai人工智能
Wendy14414 小时前
【灰度实验】——图像预处理(OpenCV)
人工智能·opencv·计算机视觉
Wendy14417 小时前
【图像掩膜】——图像预处理(OpenCV)
人工智能·opencv·计算机视觉
2zcode8 小时前
基于Matlab图像处理的瓶子自动检测与质量评估系统
开发语言·图像处理·matlab
图灵学术计算机论文辅导9 小时前
特征融合+目标检测!3篇CVPR新作把多模态目标检测拉高10个mAP
论文阅读·人工智能·考研·机器学习·计算机视觉·目标跟踪·信息与通信
灬爱码士灬9 小时前
Open CV图像基本操作可莉版
人工智能·opencv·计算机视觉
天天找自己9 小时前
图像梯度处理与边缘检测
人工智能·计算机视觉
二闹10 小时前
OpenCV识物:用代码“认出”物体
后端·opencv
云卓SKYDROID10 小时前
无人机气动设计模块解析
人工智能·计算机视觉·目标跟踪·无人机·高科技