1:sobel_amp — sobel_amp计算图像的一阶导数,用作边缘检测器。
函数:sobel_amp(Image : EdgeAmplitude : FilterType, Size : )
参数:
Image (in):输入图像
EdgeAmplitude (out):边缘振幅图像
FilterType(in):过滤器类型。默认值:‘thin_sum_abs’
Size (in):过滤淹模尺寸(一般数值越大,提取的轮廓边缘越暗)。默认值:3
核心代码:配合提取区域骨架,用skeleton骨骼化边缘成1像素宽度
read_image (Image, 'fabrik') sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3) threshold (EdgeAmplitude, Region, 10, 255) skeleton (Region, Skeleton) dev_display (Image) dev_set_color ('red') dev_display (Skeleton)
检测效果:
注:与sobel_amp 相似的边缘检测算子还有roberts、kirsch_amp、prewitt_amp、robinson_amp、frei_amp (较roberts算子提取效果稍好一些)等,都是通过计算图像的一阶导数来获取图像的边缘信息。
2:edges_image — 使用Deriche, Lanser, Shen或Canny过滤器提取边缘(相对来说edges_image 包含了上述的操作,因为提取出的边缘是1像素宽度)
函数:edges_image(Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : )
参数:
Image (in):输入图像
ImaAmp(out):输出边缘图像
ImaDir(out) :图像边缘方向
Filter(in):要应用的边缘算子,默认值:‘canny’
Alpha(in):值越小,图像越平滑,细节特征越少(与“canny”相反)。建议: 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9,1.0(默认), 1.1
NMS(in):非最大抑制(如果不需要,“无”)
Low(in):较低的阈值用于滞后阈值操作
High (in):迟滞阈值操作的上限阈值
核心代码:
edges_image (Image, ImaAmp, ImaDir, 'lanser2', 0.5, 'nms', 8, 16) threshold (ImaAmp, Region, 8, 255) skeleton (Region, Skeleton)
效果:
3.bandpass_image — 使用带通滤波器的边缘提取
函数:bandpass_image(Image : ImageBandpass : FilterType : )
参数:
Image (in):输入图像
ImageBandpass (out):输出边缘图像
FilterType (in) :过滤器类型:目前只支持“lines”
效果:
注:在提取线条并进行二值化之后,发现线条断断续续,可使用算子close_edges — 利用边缘振幅图像缩小边缘间隙。(相似算子close_edges_length)
4.laplace — 拉普拉斯用拉普拉斯算子对输入图像进行滤波(对图像进行滤波,然后提取零交叉点).
函数:laplace(Image : ImageLaplace : ResultType, MaskSize, FilterMask : )
参数:
Image (in):输入图像
ImageLaplace (out):Laplace-filtered结果图像
ResultType(in):类型
MaskSize(in):过滤掩膜的大小
FilterMask (in):滤波器掩模用于拉普拉斯算子
核心代码:
laplace (Image, ImageLaplace_3, 'signed', 3, 'n_8_isotropic') zero_crossing (ImageLaplace_3, RegionCrossing_3) laplace (Image, ImageLaplace_11, 'signed', 11, 'n_8_isotropic') zero_crossing (ImageLaplace_11, RegionCrossing_11) laplace_of_gauss (Image, ImageLaplaceG, 5) zero_crossing (ImageLaplaceG, RegionCrossingG)
效果:
相似滤波算子还有diff_of_gauss、laplace_of_gauss、derivate_gauss等,根据实际效果选择合适算子。
核心思想:对图像进行滤波之后,再从图像中提取零交叉。
5 .MS_LineDetecter — 本人封装的一个halcon算子,可以根据需求拟合求物体的直线、圆、椭圆等边缘轮廓,这里我主要使用其求物体的直线边缘轮廓。
函数:MS_LineDetecter(ImageIn : : iLineRow1, iLineCol1, iLineRow2, iLineCol2, iSigma, iThreshold : oLineRow1, oLineCol1, oLineRow2, oLineCol2)
参数:
ImageIn(in):输入图像
iLineRow1(in):直线的起始段行坐标
iLineCol1(in):直线的起始段列坐标
iLineRow2(in):直线的结束段行坐标
iLineCol2(in):直线的结束段列坐标
iSigma(in):测量矩形的平滑性
iThreshold(in):测量矩形的最小边缘幅度
oLineRow1(out):直线的起始段行坐标
oLineCol1(out):直线的起始段列坐标
oLineRow2(out):直线的结束段行坐标
oLineCol2(out):直线的结束段列坐标
封装函数内的代码:
gen_cross_contour_xld (Cross1, iLineRow1, iLineCol1, 6, 0.785398) gen_cross_contour_xld (Cross2, iLineRow2, iLineCol2, 6, 0.785398) distance_pp (iLineRow1, iLineCol1, iLineRow2, iLineCol2, Distance) angle_lx (iLineRow1, iLineCol1, iLineRow2, iLineCol2, Angle) tuple_deg (Angle, Deg) scale_image_max (ImageIn, Image) measureRectNum:=20 measureRectWidth:=Distance/measureRectNum measureRectHeight:=20 get_image_size (Image, Width, Height) row:=[] col:=[] for Index := 0 to measureRectNum by 1 gen_rectangle2 (Rectangle, iLineRow1+cos(Angle+rad(90))*measureRectWidth*Index, iLineCol1+sin(Angle+rad(90))*measureRectWidth*Index, \ Angle+rad(90), measureRectHeight,measureRectWidth/2) gen_measure_rectangle2 (iLineRow1+cos(Angle+rad(90))*measureRectWidth*Index, iLineCol1+sin(Angle+rad(90))*measureRectWidth*Index, \ Angle+rad(90), measureRectHeight,measureRectWidth/2, Width, Height, 'nearest_neighbor', MeasureHandle) measure_pos (Image, MeasureHandle, iSigma, iThreshold, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance1) row:=[row,RowEdge] col:=[col,ColumnEdge] gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 6, Angle) endfor gen_contour_polygon_xld (Contour, row, col) fit_line_contour_xld (Contour, 'tukey', -1, 0, 5, 2, oLineRow1, oLineCol1, oLineRow2, oLineCol2, Nr, Nc, Dist) gen_contour_polygon_xld (Contour1, [oLineRow1,oLineRow2], [oLineCol1,oLineCol2]) return ()
实战:
draw_line (200000, Row1, Column1, Row2, Column2) MS_LineDetecter (Image, Row1, Column1, Row2, Column2, 1, 50, oLineRow1, oLineCol1, oLineRow2, oLineCol2) gen_contour_polygon_xld (Contour1, [oLineRow1,oLineRow2], [oLineCol1,oLineCol2])
效果:
未完待续。。。