【机械视觉】Halcon—【七、blob阈值分割】
【机械视觉】Halcon—【七、blob阈值分割】
目录
【机械视觉】Halcon—【七、blob阈值分割】
介绍
步骤
1. 读取图像
2. 转换到灰度图(如果需要)
3. 应用阈值分割
4. 分析Blob
5. 可视化结果
完整示例代码:
自动阈值分割
算子介绍
例子
介绍
在图像处理中,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)