halcon学习之边缘检测

这里主要介绍基于亚像素提取的边缘检测方法,具体大家可以参考一本书,如果对halcon很熟悉的就不用了看了,反之建议看看,该书为《机器视觉算法原理与编程实践》,我也是跟着敲了一遍代码,很多都可以达到触类旁通,这里就不详细介绍了,写博客的目的是便于自己以后查找

read_image (Image, 'F:/机器视觉/Halcon机器视觉算法原理与编程实战/code/code/data/flower')

rgb1_to_gray (Image, GrayImage)
*像素级边缘提取

*1.使用sobel_amp
*细节丰富
sobel_amp (GrayImage, EdgeAmplitude, 'sum_abs', 3)
*加入滤波器的,如果卷积核增大了,则需要加入滤波器进行平滑操作
sobel_amp (GrayImage, EdgeAmplitude1, 'sum_abs_binomial', 3)
sobel_amp (GrayImage, EdgeAmplitude1, 'sum_sqrt', 3)
*细节缺失
sobel_amp (GrayImage, EdgeAmplitude1, 'thin_sum_abs', 3)

sobel_amp (GrayImage, EdgeAmplitude1, 'thin_max_abs', 3)

sobel_amp (GrayImage, EdgeAmplitude1, 'x', 3)

sobel_amp (GrayImage, EdgeAmplitude1, 'y', 3)
*加入滤波器的
sobel_amp (GrayImage, EdgeAmplitude1, 'sum_abs_binomial', 3)
threshold (EdgeAmplitude1, Regions, 100, 255)
skeleton (Regions, Skeleton)

*2.sobel_dir主要是带方向
sobel_dir (GrayImage, EdgeAmplitude2, EdgeDirection2, 'sum_abs', 3)


*3.edges_image,该算子和sobel算子类似,使用了非极大值抑制和滞后阈值,使提取的边缘更细化
*同样该算子返回精确的边缘梯度和方向
*下面是不使用非极大值抑制和滞后阈值
edges_image (GrayImage, ImaAmp, ImaDir, 'canny', 1, 'none', -1, -1)
*使用非极大值抑制不使用阈值滞后
edges_image (GrayImage, ImaAmp1, ImaDir1, 'canny', 1, 'nms', -1, -1)
*使用非极大值抑制和阈值滞后
edges_image (GrayImage, ImaAmp2, ImaDir2, 'canny', 1, 'nms', 20, 40)
threshold (ImaDir2, Regions1, 1, 255)
skeleton (Regions1, Skeleton1)

*4.edges_color是提取彩色图像的边缘,其他参数和edges_image很类似
edges_color (Image, ImaAmp3, ImaDir3, 'canny', 1, 'nms', 20, 40)

*5.derivate_gauss算子不仅可以提取图像边缘,该算子可以平滑图像、边缘检测:提取图像的边缘、角点检测:检测图像上的角点
derivate_gauss (GrayImage, DerivGauss, 0.9, 'xx')

*6.laplace算子,该算子是对图像求二次导,会在边缘产生零点,通常和zero_crossing算子配合使用获取零点
* 由于laplace算子对孤立算子响应更强烈,因此使用前需要使用滤波器进行平滑
laplace (Image, ImageLaplace, 'signed', 11, 'n_8_isotropic')
zero_crossing (ImageLaplace, RegionCrossing)
laplace (Image, ImageLaplace1, 'absolute', 3, 'n_4')

laplace_of_gauss (Image, ImageLaplace2, 2)
zero_crossing (ImageLaplace2, RegionCrossing1)

*亚像素级边缘提取
*1.edges_sub_pix使用不同的滞后阈值处理以此进行对比
edges_sub_pix (GrayImage, Edges, 'lanser2', 0.5, 5, 50)
edges_sub_pix (GrayImage, Edges1, 'lanser2', 0.5, 25, 50)
edges_sub_pix (GrayImage, Edges1, 'lanser2', 0.5, 5, 25)
*从中可以看出滞后阈值的作用是低于低阈值的边缘一定不是边缘,高于高边缘的阈值一定是边缘,中间的需要进一步确定

*2.edges_color_sub_pix提取多通道的亚像素边缘
*使用canny算子进行对亚像素提取
edges_color_sub_pix (Image, Edges2, 'canny', 0.5, 5, 50)
*使用sobel_fast算子进行对亚像素提取
edges_color_sub_pix (Image, Edges2, 'sobel_fast', 0.5, 5, 50)
edges_color_sub_pix (Image, Edges2, 'sobel_fast', 0.5, 45, 50)

*3.lines_gauss算子
lines_gauss (GrayImage, Lines, 1.5, 1, 8, 'light', 'true', 'bar-shaped', 'true')
*轮廓处理
*上面都是提取轮廓,是处理图像的第一步,下面就是把提取到的轮廓进行处理,如何处理呢?无非就是分割、筛选、连接和拟合
*这里先把每个步骤的关键算子写出来,然后例子讲解
*1.轮廓分割:
*segment_contours_xld:可以把轮廓分割成线段、圆弧、椭圆等预定义的形状,分割得到的线段使用select_obj进行处理
*gen_polygons_xld、split_contours_xld算子组合使用和segment_contours_xld类似,但是两部的结果是只分割出线段
*使用两部法,将生成XLD多边形类型的轮廓

*2.轮廓的筛选
* select_shape_xld:该算子和select_shape很类似,具有强大的选择功能,也可以使用select_contours_xld,该算子包含了更多的线性特征
*如果需要人机交互选择,可以通过select_xld_point算子,通过单击鼠标进行选择


*3.轮廓的连接
*union_collinear_contours_xld:适用于共线的连接

*union_straight_contours_xld :同方向的临近连接
*union_adjacent_contours_xld :端点临近的连接

*union2_closed_contours_xld  闭合轮廓
*union2_closed_polygons_xld

*4.拟合
*fit_circle_contour_xld 
*fit_ellipse_contour_xld 
*fit_line_contour_xld
*fit_rectangle2_contour_xld
read_image (Image, 'F:/机器视觉/Halcon机器视觉算法原理与编程实战/code/code/data/shapes')
rgb1_to_gray (Image, GrayImage2)
get_image_size (GrayImage2, Width, Height)

*提取亚像素边缘,得到初始轮廓

edges_sub_pix (GrayImage2, Edges3, 'canny', 2.5, 15, 40)

*对轮廓进分割
segment_contours_xld (Edges3, ContoursSplit, 'lines_circles', 5, 4, 2)
select_contours_xld (ContoursSplit, SelectedContours, 'contour_length', 20, Width/2, -0.5, 0.5)
union_adjacent_contours_xld (SelectedContours, UnionContours, 20, 1, 'attr_keep')





read_image (Image1, 'F:/机器视觉/Halcon机器视觉算法原理与编程实战/code/code/data/flower')
rgb1_to_gray (Image1, GrayImage1)

threshold (GrayImage1, Region, 130, 255)
closing_circle (Region, RegionClosing, 20)
*获取前进目标的初始轮廓
gen_contour_region_xld (RegionClosing, Contours, 'border')

fit_circle_contour_xld (Contours, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, 6.28318, 'positive', 1)
dev_display (Contours)
dev_display (ContCircle)

猜你喜欢

转载自blog.csdn.net/weixin_42398658/article/details/105982430