halcon-亚像素边缘提取教程
序号 | 标题 | 网址 |
1 | 亚像素定义 | Halcon 算子 edges_sub_pix 亚像素定义以及滤波器(一)_edgessubpix-CSDN博客 |
2 | ||
3 | 使用场景 | Halcon 轮廓检测常用算子、原理及应用场景_halcon boundary求边界的原理-CSDN博客 |
4 | 算子edges_sub_pix使用方法 | Halcon edges_sub_pix_halcon edgessubpix-CSDN博客 |
实例教程 | edges_sub_pix边缘提取_mob64ca13f9e726的技术博客_51CTO博客 |
1.边缘提取
边缘提取指数字图像处理中,对于图片轮廓的一个处理。对于边界处,灰度值变化比较剧烈的地方,就定义为边缘。也就是拐点,拐点是指函数发生凹凸性变化的点。二阶导数为零的地方。并不是一阶导数,因为一阶导数为零,表示是极值点。
边缘增强算子,突出图像中的局部边缘,然后定义象素的“边缘强度”,通过设置阈值的方法提取边缘点集。由于噪声和模糊的存在,监测到的边界可能会变宽或在某点处发生间断。因此,边界检测包括两个基本内容:
边缘定义:图像灰度变化率最大的地方(图像灰度值变化最剧烈的地方)。图像灰度在表面法向变化的不连续造成的边缘。一般认为边缘提取是要保留图像的灰度变化剧烈的区域,这从数学上看,最直观的方法就是微分(对于数字图像来说就是差分),在信号处理的角度来看,也可以说是用高通滤波器,即保留高频信号。
2.边缘提取方法
2.1、只保留图片中感兴趣的区域,先阈值膨胀保留图片中感兴趣区域,只处理图片中需要处理的区域
threshold阈值分割,
形态学处理dilation_circle,erosion_circle
ROI Region: difference,union1
抠图获取ROI:reduce_domain
2.2 提取轮廓---合并轮廓上相邻的不相连的点,根据轮廓特征选择相应轮廓
获取轮廓亚像素,像素 edges_sub_pix ,edges_image;
对轮廓选择:切割edge: segment_contours_xld,segment_contour_attrib_xld
选择符合要求轮廓整合在一起:union_adjacent_contours_xld
3 相关算子
3.1
4 实例代码
*获取硬币边缘read_image (Cicle, 'E:/学习/Halcon/玩套路之边缘检测/玩套路之边缘检测/cicle.bmp')dev_set_draw('margin')dev_set_color('red')*获取ROIgen_circle (ROI_0, 253.451, 321.26, 179.988)reduce_domain(Cicle, ROI_0, ImageReduced)*二值化处理,并打散连接区域,选取目标区域threshold(ImageReduced,Regions,23,255)connection(Regions, ConnectedRegions)select_shape(ConnectedRegions,SelectedRegions,'area','and',57706.4,86146.8)*将目标区域进行膨胀处理dilation_circle(SelectedRegions, RegionDilation, 3.5)*将目标区域进行腐蚀处理erosion_circle(SelectedRegions, RegionErosion, 5.5)*填充孔洞fill_up(RegionErosion, RegionFillUp)*将膨胀后的区域和腐蚀后的区域进行减操作,并进行抠图处理,目的是为了得到有边缘的真实图像difference(RegionDilation,RegionFillUp, RegionDifference)union1(RegionDifference, RegionUnion)reduce_domain(ImageReduced,RegionUnion,ImageReduced1)edges_sub_pix(ImageReduced1, Edges, 'canny', 1, 20, 40)*smooth_contours_xld(Edges, SmoothedContours, 55)*根据得到的真实边缘,进步处理和计算所需的线、弧、圆等segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2)select_contours_xld (ContoursSplit, SelectedContours, 'contour_length', 5, 1000, -0.5, 0.5)union_adjacent_contours_xld (SelectedContours, UnionContours3, 10, 1, 'attr_keep')length_xld(UnionContours3, Length)tuple_max(Length, Max)tuple_find(Length, Max, Indices)select_obj(UnionContours3, ObjectSelected, Indices+1)length_xld(ObjectSelected, Length1)dev_clear_window()dev_display(Cicle)dev_display(ObjectSelected)fit_circle_contour_xld (ObjectSelected, 'algebraic', -1, 0, 0, 3, 2, Row1, Column1, Radius1, StartPhi, EndPhi, PointOrder)gen_circle (Circle1, Row1, Column1, Radius1)dev_clear_window()dev_display(Cicle)dev_set_color('green')dev_display(Circle1)
dev_get_window(WindowHandle)dev_set_draw('margin')dev_set_color('green')
*获取硬币边缘read_image(sourceImage, '1.jpg')read_image (Image, '1.jpg')
*阈值分割图像threshold(Image, Regions, 10, 255)*分割连通区域
connection(Regions, ConnectedRegions)*选择面积大于100,小于86146select_shape(ConnectedRegions,rectangularity,'area','and',10,861460)* 获取选中的区域数量
count_obj(rectangularity, Number)* 循环显示每个区域
for I := 1 to Number by 1clear_window(WindowHandle)select_obj(rectangularity, Region, I)disp_region(Region, WindowHandle)* 将区域转换为图像(二值图像)* write_region(Region,'img_'+I)*paint_region(Region, Image, ImageResult, [0,255,0], 'fill')*write_image(ImageResult, 'png', 0, 'example_painted')shape_trans(Region, ConvexRegions, 'convex')disp_obj(ConvexRegions, WindowHandle)reduce_domain(sourceImage, Region, ImageReduced)dev_display(ImageReduced)write_image(ImageReduced, 'png', 0, 'ImageReduced'+I)crop_domain(sourceImage,Region)* 可以在这里添加暂停或其它交互操作,例如等待用户按键继续查看下一个区域*stop()
endfor