【机械视觉】Halcon—【七、blob阈值分割—regiongrowing区域生长法目标提取】
目录
【机械视觉】Halcon—【七、blob阈值分割—regiongrowing区域生长法目标提取】
介绍
在图像处理中,Blob(Binary Large Object)分析是一种常见的用于分割和测量图像中特定形状区域的技术。Halcon是一个强大的机器视觉软件库,提供了丰富的工具和函数来处理图像,包括Blob分析。在Halcon中,使用阈值分割是实现Blob分析的第一步,下面是如何在Halcon中实现基于阈值的图像分割的步骤:
步骤
1. 读取图像
首先,需要使用Halcon的函数读取图像。这可以通过read_image函数完成。
read_image(Image, 'path_to_your_image')
2. 转换到灰度图(如果需要)
如果你的图像是彩色的,通常需要将其转换为灰度图,因为Blob分析通常在灰度图上进行。
rgb1_to_gray(Image, GrayImage)
3. 应用阈值分割
使用threshold函数对图像应用阈值分割。你需要指定阈值和可能的区域填充值。
threshold(GrayImage, Region, 100, 255) // 假设我们选择100作为阈值
4. 分析Blob
一旦你有了分割的二值图像(即包含了目标的区域),你可以使用count_obj、select_obj等函数来分析这些区域。
count_obj(Region, Number) // 计算区域数量
select_obj(Region, SelectedRegions, 1) // 选择最大的区域(如果有多个Blob)
5. 可视化结果
最后,你可以使用dev_display或dev_set_color等函数来可视化结果。
dev_display(SelectedRegions) // 显示选定的区域
dev_set_color('green') // 设置颜色为绿色
dev_display(SelectedRegions) // 再次显示以应用颜色设置
完整示例代码:
read_image(Image, 'path_to_your_image')
rgb1_to_gray(Image, GrayImage)
threshold(GrayImage, Region, 100, 255)
count_obj(Region, Number)
select_obj(Region, SelectedRegions, 1) // 选择最大的Blob(如果有多个)
dev_display(SelectedRegions)
dev_set_color('green')
dev_display(SelectedRegions) // 以绿色显示选定的Blob区域
通过上述步骤,可以在Halcon中实现基于阈值的Blob分割。根据实际情况,你可能需要调整阈值或预处理步骤(如滤波、增强对比度等)来优化分割效果。Halcon提供了丰富的图像处理函数,可以灵活应对各种复杂的图像分析需求。
自动阈值分割
算子介绍
auto_threshold (Image, Regions, sigma)
自动阈值分割原理: 主要使用在自动分割多阈值的情况下
- 1 计算图像灰度直方图
- 2 高斯函数平滑直方图
- 3 在平滑后直方图当中寻找波谷作为阈值
- 4 使用找到阈值对图像进行多级阈值分割
建议 sigma
- 高对比度图像 使用较小值(3-5) 保留了更多细节 产生更多阈值
- 低对比度图像 使用较大值(6-10)平滑效果更强,产生阈值就少
例子
read_image (Image, 'egypt1')
sigma:=4
*自动阈值分割原理: 主要使用在自动分割多阈值的情况下
*1 计算图像灰度直方图
*2 高斯函数平滑直方图
*3 在平滑后直方图当中寻找波谷作为阈值
*4 使用找到阈值对图像进行多级阈值分割
*建议 sigma
*高对比度图像 使用较小值(3-5) 保留了更多细节 产生更多阈值
*低对比度图像 使用较大值(6-10)平滑效果更强,产生阈值就少
*sigma高斯平滑值
auto_threshold (Image, Regions, sigma)
*绘制输入图像的灰度直方图
*AbsoluteHisto 绝对分布 0-255灰度值个数
*RelativeHisto 相对分布 0-255灰度值 比例
gray_histo (Image, Image, AbsoluteHisto, RelativeHisto)
*绘制 中间没有进行高斯平滑操作
*gen_region_histo (Region, AbsoluteHisto, 255, 255, 1)
dev_clear_window ()
*对绝对分布进行平滑操作
*把绝对分布生成一个一唯函数
create_funct_1d_array (AbsoluteHisto, Function)
*对函数进行高斯平滑
smooth_funct_1d_gauss (Function, sigma, SmoothedFunction)
*把SmoothedFunction转成点的形式
*XValues x值 灰度值
*YValues y值 某个灰度值高斯平滑之后值
funct_1d_to_pairs (SmoothedFunction, XValues, YValues)
*YValues 生成一个直方图
gen_region_histo (Region, YValues, 255, 255, 1)
二值化自动阈值分割
二值化自动阈值分割:适用于具有明显的双峰的直方图,自动确定阈值
*参数1 输入图片
*参数2 二值化输出区域
*参数3 阈值分割方式
*max_separability 最大限度分离物体和背景部分
*smooth_histo 获取直方图,再平滑直方图, 查找最小值作为阈值
*参数4 提取的区域是亮部分还是暗部分 dark暗部分,light 亮部分
*参数5 阈值
binary_threshold (Image, Region, 'max_separability', 'light', UsedThreshold)
字符阈值分割
char_threshold()字符阈值分割: 专门用于字符分割的阈值处理算子,基于局部自适应阈值的方法提取图像当中的文字区域
例子:
dev_clear_window ()
read_image (Image, 'alpha1')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
* 专门用于字符分割的阈值处理算子,基于局部自适应阈值的方法提取图像当中的文字区域
* 参数1 输入图片
* 参数2 输入区域
* 参数3 输出图像
* 参数4 sigma高斯平滑度
* 参数5 用于确定阈值的百分比 定义字符与背景分离的程度 常用范围90-98之间,暗背景/亮字符96-98
* 参数6 选择的阈值
char_threshold (Image, Image, Characters, 2, 95, Threshold)
connection (Characters, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 110, 500)
dev_display (SelectedRegions)
regiongrowing()区域生长法目标提取
在Halcon中,regiongrowing 算子用于基于像素的相似性进行图像分割。这种方法特别适用于从图像中提取具有特定特征的区域,例如颜色、亮度、纹理等相近的像素群。regiongrowing 算子可以基于多种相似性度量,如灰度值、颜色、梯度等。
read_image (Image, 'fabrik')
dev_set_colored (12)
* 阈值分割+ 连通处理 + 面积筛选
* 参数1 输入图像
* 参数2 输出的区域
* 参数3 竖直方向距离 建议为奇数
* 参数4 水平方向的距离 建议为奇数
* 参数5 灰度值小于等于6
* 参数6 面积的最小值100
regiongrowing (Image, Regions, 3, 3, 6, 100)
* rectangle1
* 选择最接近平行于坐标轴的矩形区域
* 基于矩形拟合的相似度
* 'rectangle2'
* 选择最接近任意方向矩形(旋转矩形)的区域
* *基于最小外接矩形的相似度
*max_area
select_shape_std (Regions, SelectedRegions, 'rectangle2',90)