halcon中,对图像做阈值分割后,如何去掉图像边缘线条
时间: 2024-04-16 21:26:51 浏览: 373
在Halcon中,对图像进行阈值分割后,如果想去掉图像边缘线条,可以使用以下方法:
1. 使用`ClosingCircle`算子或`ClosingRectangle`算子对二值化图像进行闭运算,以填充边缘空洞并平滑边缘线条。
```cpp
// 使用ClosingCircle算子对二值化图像进行闭运算
closing_circle (BinaryImage, BinaryImage, 5);
// 使用ClosingRectangle算子对二值化图像进行闭运算
closing_rectangle(BinaryImage, BinaryImage, 5, 5);
```
2. 使用`OpeningCircle`算子或`OpeningRectangle`算子对二值化图像进行开运算,以去除细小的边缘噪点。
```cpp
// 使用OpeningCircle算子对二值化图像进行开运算
opening_circle (BinaryImage, BinaryImage, 3);
// 使用OpeningRectangle算子对二值化图像进行开运算
opening_rectangle(BinaryImage, BinaryImage, 3, 3);
```
根据具体情况选择合适的闭运算或开运算的参数值,以达到去除边缘线条的效果。
相关问题
halcon线条检测
### Halcon 中进行线条检测的方法
在 Halcon 软件中,线条检测是一项常见的图像处理任务,通常用于工业自动化中的质量控制和其他应用。以下是几种常用的线条检测方法及其具体实现方式:
#### 使用边缘提取算子 `edges_sub_pix`
`edges_sub_pix` 是一种高精度的边缘检测工具,能够有效地定位图像中的线条位置并提供亚像素级别的准确性。
```hdevelop
* 加载测试图像
read_image (Image, 'fabrik')
* 应用 Sobel 运算符来增强边缘效果
sobel_amp (Image, EdgeImage, 'sum_abs', 3)
* 执行边缘细化操作以获得更清晰的结果
threshold (EdgeImage, Region, 128, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 100, 99999)
* 提取精确的边缘坐标
edges_sub_pix (SelectedRegions, 'canny', -1, 1, 5, 0.4, 0.2, Edges)
```
此代码片段展示了如何利用 Sobel 滤波器增强图像边界特征,并通过设定合适的阈值筛选出显著轮廓,最后调用 `edges_sub_pix` 函数获取高质量的线段数据[^1]。
#### 利用 Hough 变换寻找直线
对于较为规整的目标物体上的线条,可以采用霍夫变换来进行全局性的直线拟合。这种方法特别适合于识别具有固定方向特性的结构化图案内的直边。
```hdevelop
* 创建样本图像
gen_rectangle1 (Rectangle, 0, 0, 60, 100)
* 添加噪声模拟真实环境影响
add_noise_white (Rectangle, ImageNoise, 10, 255, 2)
* 实施 Canny 边缘探测算法准备输入给霍夫变换的数据集
binomial_filter(ImageNoise, BinomialFiltered, 7)
edges_image(BinomialFiltered, Edges, 'canny', 1, 20, 40)
* 应用标准霍夫变换搜索可能存在的直线段
hough_line_trans(Edges, HTImage, 'standard', 1, 1, 0, pi/2, 1, 1)
hough_line_peaks(HTImage, RowPeaks, ColumnPeaks, AnglePeaks, Peaks, \
'standard', 1, 1, 0, pi / 2, 50, 0, 100, 100)
* 绘制找到的所有直线
for I := 0 to |RowPeaks|-1 by 1
gen_contour_polygon_xld (Contour, [0, Width],\
[(Height-1)*sin(AnglePeaks[I]), sin(AnglePeaks[I])],\
[-cos(AnglePeaks[I]), -(Width-1)*cos(AnglePeaks[I])+ColumnPeaks[I]])
endfor
draw_object(WindowHandle, Contour)
```
上述脚本说明了怎样构建一个简单的实验场景并通过霍夫变换成功捕捉到其中所含有的多条平行或交叉分布的直线实体[^2]。
#### 结合形态学操作优化结果
当面对复杂背景下的细长形状时,除了基本的边缘检测之外还可以考虑加入一些额外的操作步骤比如腐蚀膨胀等形态学术语定义的动作进一步改善最终输出的质量。
```hdevelop
* 假设已经获得了初步的二值化后的候选区域
dilation_circle(CandidateRegion, DilatedRegion, 1.5) % 对原始目标稍作放大以便后续分析
* 定义一个小尺寸圆形SE作为平滑滤镜去除微小突起物
gen_circle(SmallCircleStructuringElement, 0, 0, 1.5)
morphology_opening(DilatedRegion, OpenedRegion, SmallCircleStructuringElement)
* 寻找连通域并将它们按照面积大小排序选出最有可能代表实际待测对象的部分
connection(OpenedRegion, ConnectedComponents)
sort_region(ConnectedComponents, SortedByArea, 'area', 'descending', MinArea)
* 计算这些选定组件的主要轴向属性从而得到近似描述其走向的信息
elliptic_axis(SortedByArea, RA, RB, PhiA)
disp_message(WindowHandle,'Main orientation angle:'+num2str(PhiA))
```
这段示范性代码体现了针对特定应用场景下对初始分割出来的疑似线条状要素实施一系列预处理措施的过程,目的是为了提高后期量化评估环节所得结论的有效性和可靠性[^3].
阅读全文
相关推荐
















