0.frei_amp(Image : ImageEdgeAmp : : )
frei_amp计算图像数据一阶导数的近似值,并用作边缘检测器。过滤器是基于以下过滤器掩码:
A =
1 sqrt(2) 1
0 0 0
-1 -sqrt(2) -1
B =
1 0 -1
sqrt(2) 0 -sqrt(2)
1 0 -1
结果图像包含掩码A和掩码B的最大振幅。
1.frei_dir(Image : ImageEdgeAmp, ImageEdgeDir : : )
frei_dir计算图像数据一阶导数的近似值,并用作边缘检测器。过滤器是基于以下过滤器掩码:
工业视觉halcon边缘滤波器函数介绍8
结果图像包含掩模A和掩模b的最大振幅。
边缘方向在ImageEdgeDir中返回,并以2度的步骤存储,即,在边缘方向图像中,一个在数学上为正且相对于水平轴的x度的边缘方向存储为x / 2。
此外,还考虑了光强变化的方向。[ExEy]表示图像梯度。然后返回如下边缘方向r/2:
工业视觉halcon边缘滤波器函数介绍7
边缘幅值为0的点指定边缘方向255(未定义方向)。
例程:
read_image(Image,'fabrik')
frei_amp(Image,Frei_amp)
threshold(Frei_amp,Edges,128,255)
frei_dir(Image,Frei_dirA,Frei_dirD)
threshold(Frei_dirA,Res,128,255)
2.kirsch_amp(Image : ImageEdgeAmp : : )
kirsch_amp计算图像数据一阶导数的近似值,并用作边缘检测器。
过滤器是基于以下过滤器掩码:
-3 -3 5 -3 5 5 5 5 5 5 5 -3
-3 0 5 -3 0 5 -3 0 -3 5 0 -3
-3 -3 5 -3 -3 -3 -3 -3 -3 -3 -3 -3
5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
5 0 -3 5 0 -3 -3 0 -3 -3 0 5
5 -3 -3 5 5 -3 5 5 5 -3 5 5
结果图像包含所有掩码的最大振幅。
例程:
read_image(Image,'fabrik')
kirsch_amp(Image,Kirsch_amp)
threshold(Kirsch_amp,Edges,128,255)
3.kirsch_dir(Image : ImageEdgeAmp, ImageEdgeDir : : )
kirsch_dir计算图像数据一阶导数的近似值,并用作边缘检测器。
过滤器是基于以下过滤器掩码:
-3 -3 5 -3 5 5 5 5 5 5 5 -3
-3 0 5 -3 0 5 -3 0 -3 5 0 -3
-3 -3 5 -3 -3 -3 -3 -3 -3 -3 -3 -3
5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
5 0 -3 5 0 -3 -3 0 -3 -3 0 5
5 -3 -3 5 5 -3 5 5 5 -3 5 5
结果图像包含所有掩码的最大振幅。边缘方向在ImageEdgeDir中返回,并存储为x / 2。它们对应于产生最大响应的掩模的方向。
例程:
read_image(Image,'fabrik')
kirsch_dir(Image,Kirsch_dirA,Kirsch_dirD)
threshold(Kirsch_dirA,Res,128,255)
4.prewitt_amp(Image : ImageEdgeAmp : : )
prewitt_amp计算图像数据一阶导数的近似值,并用作边缘检测器。
过滤器是基于以下过滤器掩码:
A =
1 1 1
0 0 0
-1 -1 -1
B =
1 0 -1
1 0 -1
1 0 -1
例程:
read_image(Image,'fabrik')
prewitt_amp(Image,Prewitt)
threshold(Prewitt,Edges,128,255)
5.prewitt_dir(Image : ImageEdgeAmp, ImageEdgeDir : : )
prewitt_dir计算图像数据的一阶导数的近似值,并用作边缘检测器。
过滤器是基于以下过滤器掩码:
A =
1 1 1
0 0 0
-1 -1 -1
B =
1 0 -1
1 0 -1
1 0 -1
结果图像包含掩模A和掩模b的最大振幅。
边缘方向在ImageEdgeDir中返回,并以2度的步骤存储,
即,在边缘方向图像中,一个x度的边缘方向在数学上是正的,且相对于水平轴为x / 2。
此外,还考虑了光强变化的方向。设[Ex,Ey]表示图像梯度。然后返回如下边缘方向r/2:
工业视觉halcon边缘滤波器函数介绍3
边缘幅值为0的点指定边缘方向255(未定义方向)。
例程:
read_image(Image,'fabrik')
prewitt_dir(Image,PrewittA,PrewittD)
threshold(PrewittA,Edges,128,255)
6.robinson_amp(Image : ImageEdgeAmp : : )
robinson_amp计算图像数据一阶导数的近似值,并用作边缘检测器。
在robinson_amp中,最初提出的8个3x3滤波器掩模中的4个与图像进行卷积。
其他四个掩码是通过乘以-1得到的。所有掩码只包含值0、1、-1、2、-2。
-1 0 1 2 1 0
-2 0 2 1 0 -1
-1 0 1 0 -1 -2
0 1 2 1 2 1
-1 0 1 0 0 0
-2 -1 0 -1 -2 -1
例程:
read_image(Image,'fabrik')
robinson_amp(Image,Robinson_amp)
threshold(Robinson_amp,Edges,128,255)
7.robinson_dir(Image : ImageEdgeAmp, ImageEdgeDir : : )
robinson_dir计算图像数据一阶导数的近似值,并用作边缘检测器。
在robinson_amp中,最初提出的8个3x3滤波器掩模中的4个与图像进行卷积。
其他四个掩码是通过乘以-1得到的。所有掩码只包含值0、1、-1、2、-2。
-1 0 1 2 1 0
-2 0 2 1 0 -1
-1 0 1 0 -1 -2
0 1 2 1 2 1
-1 0 1 0 0 0
-2 -1 0 -1 -2 -1
结果图像包含所有掩码的最大振幅。
边缘方向在ImageEdgeDir中返回,并存储为x / 2。
它们对应于产生最大响应的掩模的方向。
例程:
read_image(Image,'fabrik')
robinson_dir(Image,Robinson_dirA,Robinson_dirD)
threshold(Robinson_dirA,Res,128,255)
8.sobel_amp(Image : EdgeAmplitude : FilterType, Size : )
sobel_amp计算图像的一阶导数,并用作边缘检测器。
过滤器是基于以下过滤器掩码:
A =
1 2 1
0 0 0
-1 -2 -1
B =
1 0 -1
2 0 -2
1 0 -1
根据所选的筛选器类型,这些掩码的使用方式不同。(在下文中,a和b表示对一个特定像素的图像与a和b进行卷积的结果。)
工业视觉halcon边缘滤波器函数介绍2
这里,对于垂直最大值(掩模a)和水平最大值(掩模B), thin(x)分别等于x,否则为0。
因此,对于“thin_sum_abs”和“thin_max_abs”,渐变图像会变薄。
对于过滤器类型“x”和“y”,如果输入图像类型为byte,则输出图像类型为int1,否则为int2。
对于大小为3x3的Sobel运算符,直接应用相应的滤波器a和B,而对于较大的滤波器大小,
则首先使用高斯滤波器(gauss_image)或大小为Size-2的二项式滤波器(binomial_filter)对输入图像进行平滑处理。
以上FilterType值选择高斯滤波器。
这里必须使用Size = 5、7、9、11或13。
二项式过滤器是通过将'_binomial'附加到上述FilterType值来选择的。
在这里,大小可以选择在5到39之间。
此外,可以通过传递两个大小值来选择不同数量的平滑列和行方向。
这里,大小的第一个值对应于二项式滤波器的掩模宽度(在列方向平滑),第二个值对应于掩模高度(在行方向平滑)。
二项滤波器只能用于字节、uint2和实数类型的图像。由于平滑降低了边缘振幅,在这种情况下,边缘振幅要乘以2,以防止信息丢失。
因此,
sobel_amp(I,E,FilterType,S)
对于 Size > 3等同于
scale_image(I,F,2,0)
gauss_image(F,G,S-2)
sobel_amp(G,E,FilterType,3)
或
scale_image(I,F,2,0)
binomial_filter(F,G,S[0]-2,S[1]-2)
sobel_amp(G,E,FilterType,3).
例程:
read_image(Image,'fabrik')
sobel_amp(Image,Amp,'sum_abs',3)
threshold(Amp,Edg,128,255)
9.sobel_dir(Image : EdgeAmplitude, EdgeDirection : FilterType, Size : )
sobel_dir计算图像的一阶导数,并用作边缘检测器。过滤器是基于以下过滤器掩码:
A =
1 2 1
0 0 0
-1 -2 -1
B =
1 0 -1
2 0 -2
1 0 -1
根据所选的筛选器类型,这些遮罩的使用方式不同。(在下文中,a和b表示对一个特定像素的图像与a和b进行卷积的结果。)
工业视觉halcon边缘滤波器函数介绍1
例程:
read_image(Image,'fabrik')
sobel_dir(Image,Amp,Dir,'sum_abs',3)
threshold(Amp,Edg,128,255)
10.highpass_image(Image : Highpass : Width, Height : )
highpass_image通过使用下面矩阵的线性滤波器提取图像中的高频成分(对于7x5矩阵):
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 -35 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
这相当于应用一个均值操作符(mean_image),然后减去原始灰度值。
值128被添加到结果中,即,128为零交叉。
这个滤波器强调高频分量(边角)。截止频率由滤波器矩阵的大小(高x宽)决定:矩阵越大,截止频率越小。
在图像边框处,像素的灰度值被镜像。
如果流量过大或过低,则剪切灰度值(255和0.)。
例程:
read_image (Image, 'particle')
highpass_image (Image, Highpass, 21, 21)
threshold (Highpass, Region, 132, 255)
opening_circle (Region, RegionOpening, 1.5)
dev_display (Image)
dev_display (RegionOpening)
11.info_edges( : : Filter, Mode, Alpha : Size, Coeffs)
info_edges返回edges_image中使用的任何过滤器的宽度估计数。
为此,对滤波器的连续脉冲响应进行采样,直到第一个滤波器系数小于最大系数的5%。
Alpha是过滤器参数(参见edges_image)。支持7个边缘算子(参数Filter):
'deriche1', 'lanser1', 'deriche2', 'lanser2', 'shen', 'mshen' and 'canny'.
参数Mode(“edge”/“smooth”)用于确定是否要采样对应的edge或smooth操作符。
Canny算子(使用高斯平滑)使用传统的滤波器掩模实现,而所有其他滤波器都是递归实现的。
因此,对于Canny滤波器,除滤波器宽度外,一维脉冲响应系数f(n)width>=0以Coeffs的形式返回。
例程:
read_image(Image,'fabrik')
info_edges('lanser2','edge',0.5,Size,Coeffs)
edges_image(Image,Amp,Dir,'lanser2',0.5,'none',-1,-1)
hysteresis_threshold(Amp,Margin,20,30,30)
12.laplace(Image : ImageLaplace : ResultType, MaskSize, FilterMask : )
laplace滤波器的输入图像Image 使用拉普拉斯算子。
根据参数FilterMask,使用拉普拉斯算子的近似如下:
'n_4'
1
1 -4 1
1
n_8
1 1 1
1 -8 1
1 1 1
n_8_isotropic
10 22 10
22 -128 22
10 22 10
对于这三个过滤器掩码,应用以下结果灰度值的规范化,(即: 'n_4'归一化除以1,'n_8'归一化除以2,'n_8_isotropic'归一化除以32。
对于大小为3x3的拉普拉斯算子,直接应用相应的滤波器,
而对于较大的滤波器大小,则首先使用高斯滤波器(gauss_image)或二项式滤波器(binomial_filter)对输入图像进行平滑处理,
其大小为MaskSize-2。
这里必须使用MaskSize = 5、7、9、11或13。
二项式过滤器是通过将'_binomial'附加到ResultType的上述值来选择的。
在这里,MaskSize可以选择在5到39之间。
此外,可以通过传递两个MaskSize值来为列和行方向选择不同的平滑量。
这里,MaskSize的第一个值对应于二项式滤波器的掩模宽度(在列方向平滑),
第二个值对应于掩模高度(在行方向平滑)。
- 因此,
- laplace(O:R:'absolute',MaskSize,N:)
- 对于 MaskSize > 3等同于
- gauss_image(O:G:MaskSize-2:) >
- laplace(G:R:'absolute',3,N:).
- 及
- laplace(O:R:'absolute_binomial',MaskSize,N:)
- 等同于
- binomial_filter(O:B:MaskSize-2,MaskSize-2:) >
- laplace(B:R:'absolute',3,N:).
复制代码
拉普拉斯要么返回一个字节或uint2图像中经过拉普拉斯过滤的图像(ResultType = 'absolute')的绝对值,
要么返回带符号的结果(ResultType = 'signed'或'signed_clipped')。
这里,输出图像类型具有与输入图像相同的每像素字节数(即, int1或int2)表示“signed_clipped”,
而输出图像的像素数(即, int2或int4)表示“'signed”。
13.laplace_of_gauss(Image : ImageLaplace : Sigma : )
laplace_of_gauss计算高斯拉普拉斯算子,即,高斯平滑图像上的拉普拉斯算子,用于任意平滑参数Sigma。
拉普拉斯算子由以下定义:
工业视觉halcon边缘滤波器函数介绍6
laplace_of_gauss中的导数由高斯函数的适当导数计算,
得到卷积掩模的公式如下:
工业视觉halcon边缘滤波器函数介绍5
例程:
read_image (Image, 'mreut')
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)
14.diff_of_gauss(Image : DiffOfGauss : Sigma, SigFactor : )
diff_of_gauss用高斯差近似高斯拉普拉斯算子。这些高斯函数的标准差,
根据Marr,由LoG的参数Sigma和两个标准差之比(SigFactor)计算得到:
工业视觉halcon边缘滤波器函数介绍4
对于SigFactor = 1.6,根据Marr,近似于Mexican-Hat-Operator的结果。
生成的图像存储在DiffOfGauss.。
例程:
read_image(Image,'fabrik')
diff_of_gauss(Image,Laplace,2.0,1.6)
zero_crossing(Laplace,ZeroCrossings)
15.derivate_gauss(Image : DerivGauss : Sigma, Component : )
derivate_gauss将图像与高斯函数的导数进行卷积,并计算由此得到的各种特征。
Sigma是高斯函数的参数。(平滑量)。
如果在Sigma中传递一个值,那么在列和行方向上的平滑量是相同的。
如果在Sigma中传递两个值,第一个值指定列方向的平滑量,第二个值指定行方向的平滑量。
组件的可能值为:
none : 仅平滑
'x':沿x的一阶导数。
'y': 沿y的一阶导数。
gradient 梯度的绝对值。
gradient_dir 以弧度为单位的梯度方向。
xx 沿x的二阶导数。
yy 沿y求导。
xy沿x和y的二阶导数。
'xxx 沿x的三阶导数
yyy 沿y求导
xxy沿x, x和y的三阶导数。
xyy 沿x y y的三阶导数。
det 黑森矩阵的行列式:
laplace 拉普拉斯算子(Hessian矩阵的迹):
mean_curvature 平均曲率h
gauss_curvature 高斯曲率K
area 微分区
eigenvalue1 第一特征值
eigenvalue2 第二特征值
eigenvec_dir 与弧度中的第一个特征值对应的特征向量的方向
kitchen_rosenfeld 垂直于梯度的二阶导数
zuniga_haralick 垂直于梯度的归一化二阶导数
2nd_ddg 沿梯度的二阶导数
de_saint_venant 沿梯度垂直的二阶导数
例程:
read_image (Image, 'mreut')
diff_of_gauss (Image, DiffOfGauss, 5, 1.6)
zero_crossing (DiffOfGauss, RegionCrossing1)
stop ()
laplace_of_gauss (Image, ImageLaplace, 5)
zero_crossing (ImageLaplace, RegionCrossing2)
stop ()
derivate_gauss (Image, DerivGauss, 5, 'laplace')
zero_crossing (DerivGauss, RegionCrossing3)
16.roberts(Image : ImageRoberts : FilterType : )
roberts计算图像的一阶导数,并将其用作边缘算子。
如果下面的掩码描述了图像的一部分,
A B
C D
不同的滤波器类型定义如下:
'roberts_max' max(| A - D |,| B - C |)
'gradient_max' max(| A + B - (C + D)|,| A + C - (B + D)|)
'gradient_sum' |A + B - (C + D)| + |A + C - (B + D)|
例程:
read_image(Image,'fabrik')
roberts(Image,Roberts,'roberts_max')
threshold(Roberts,Margin,128,255)
17.close_edges(Edges, EdgeImage : RegionResult : MinAmplitude : )
close_edges关闭边缘检测器输出中的间隙,从而尝试生成完整的对象轮廓。
这是通过检查每个边缘点的邻居来确定最大振幅点(即,最大梯度),如果该点的振幅大于 MinAmplitude. ,则将该点添加到边缘。
该操作符期望输入典型边缘操作符(如edges_image或sobel_amp)返回的边(Edges)和幅值图像(EdgeImage)。
close_edges不考虑边缘操作符可能返回的边缘方向。
因此,在梯度几乎恒定的区域,边缘可能变得相当“wiggly”。
例程:
read_image (Image, 'fabrik')
dev_close_window ()
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowID)
sobel_amp (Image, EdgeAmplitude, 'thin_sum_abs', 3)
threshold (EdgeAmplitude, Edges, 30, 255)
close_edges (Edges, EdgeAmplitude, EdgesExtended, 15)
dev_set_color ('green')
dev_display (EdgesExtended)
dev_set_color ('red')
dev_display (Edges)
18.close_edges_length(Edges, Gradient : ClosedEdges : MinAmplitude, MaxGapLength : )
close_edges_length关闭边缘检测器输出中的空白,从而尝试生成完整的对象轮廓。
该操作符期望输入典型边缘操作符(如edges_image或sobel_amp)返回的边(Edges)和幅值图像(Gradient )。
轮廓的闭合分为两步:
首先,在输入轮廓上闭合一个像素宽的间隙,消除孤立点。
在此之后,通过添加边缘点,将打开的轮廓扩展到MaxGapLength点,直到轮廓关闭或没有找到更重要的边缘点为止。
如果梯度大于MinAmplitude,则认为梯度是显著的。
作为可能的新边缘点的相邻点是轮廓线方向上的点及其8邻域内的两个相邻点。
对于每一个点,计算它的梯度和它的三个可能相邻点的最大梯度之和(提前看长度1),
然后选择具有最大和的点作为新的边缘点。
例程:
read_image (Image, 'fabrik')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowID)
sobel_amp (Image, EdgeAmplitude, 'thin_sum_abs', 3)
threshold (EdgeAmplitude, Edges, 30, 255)
close_edges_length (Edges, EdgeAmplitude, ClosedEdges, 8, 100)
dev_set_color ('green')
dev_display (ClosedEdges)
dev_set_color ('red')
dev_display (Edges)
|