set_fuzzy_measure( : : MeasureHandle, SetType, Function : )
set_fuzzy_measure从参数Function 传入一个指定的模糊函数。
指定的模糊函数使fuzzy_measure_pos和fuzzy_measure_pair / fuzzy_measure_pairing能够评估和选择检测到的边缘候选项。
为此目的,不同边缘特征的加权特征可以由每个函数定义。
这样一个指定的特征称为模糊集。
如果没有为模糊集指定函数,就意味着不能使用该特征进行最终的边缘评估。
将第二个模糊函数设置为一个集合意味着丢弃第一个定义的函数,并用第二个函数替换它。
通过reset_fuzzy_measure可以完全丢弃以前定义的模糊函数。
可定义由SetType参数选择的五种不同模糊集类型的函数,集合的子类型相互排斥:
“contrast”将使用模糊函数来评估边缘候选点的振幅。
在提取边缘对时,通过对边缘模糊对比分数的几何平均得到模糊评价。
“position”的模糊函数评估每个边缘候选对象到测量对象参考点的距离,
该距离由gen_measure_arc或gen_measure_rectangle2生成。
参考点位于起点,而“position_center'”或“position_end”将参考点设置为一维灰度值轮廓的中间或末端。
如果模糊位置评估取决于对象沿轮廓的位置,“position_first_edge”/“'position_last_edge”将参考点设置在第一个/最后一个提取的边的位置。
提取边缘对时,一对边的位置由两条边的模糊位置分数的几何平均值来引用。
与“position”类似,“position_pair”计算每个边缘对到度量对象的参考点的距离。
一对的位置由两条边之间的中心点确定。
对象的引用可以分别由'position_pair_center'、'position_pair_end'和'position_first_pair'、'position_last_pair'设置。
与“position”相反,这个集合只用于fuzzy_measure_pair /fuzzy_measure_pairing。
“size'表示一个模糊集,它以像素为单位计算一对边的赋范距离。
这个集合只被fuzzy_measure_pair /fuzzy_measure_pairing使用。
通过使用相应的模糊值0.0结束函数来指定大小的上限将加快fuzzy_measure_pair / fuzzy_measure_pairing,因为不是所有可能的对都需要考虑。
“gray”设置一个模糊函数,对一对图像的两条边之间的平均投影灰度值进行加权。
这个集合只被fuzzy_measure_pair / fuzzy_measure_pairing使用。
模糊函数定义为由至少两对值组成的分段线性函数,按x值的升序排序。
x值表示边缘特征,必须位于集合类型的参数空间内,即,以“contrast”和“gray为特征,例如字节图像在0.0 <= x <= 255.0范围内。
在“size”情况下x必须满足0.0 <= x,而在“position”情况下x可以是任意实数。
模糊函数的y值表示对应特征值的权重,必须满足0.0 <= y <= 1.0的范围。
在函数的区间之外,由最小和最大的x值定义,区间边界的y值不断地延续。
这样的模糊函数可以由create_funct_1d_pair生成。
2.fuzzy_measure_pairs(Image : : MeasureHandle, Sigma, AmpThresh, FuzzyThresh, Transition : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, RowEdgeCenter, ColumnEdgeCenter, FuzzyScore, IntraDistance, InterDistance)
fuzzy_measure re_pair用于提取垂直于矩形或环形圆弧主轴的直线边缘对。
除了measure re_pair,它还使用了模糊函数来评估和选择边缘对。
fuzzy_measure_pairs的提取算法与fuzzy_measure_pos是一致的。
此外,相邻的边被分组成对。要提取相交或包含彼此的对,可以使用fuzzy_measure_pairing。
如果Transition = 'positive',则在矩形或环形弧的主轴方向上具有从暗到光的Transition的边缘点将在RowEdgeFirst和ColumnEdgeFirst中返回。
在这情况下,具有从亮到暗转换的对应边缘以RowEdgeSecond和columnedgesececond返回。
如果Transition = 'negative',则行为正好相反。
如果Transition = 'all',则第一个检测到的边缘定义RowEdgeFirst和ColumnEdgeFirst。
即。,根据测量对象的位置,返回具有亮-暗-亮过渡的边缘对或具有暗-亮-暗过渡的边缘对。
这适用于测量相对于背景具有不同亮度的对象。
提取亚像素边缘位置后,边缘配对
配对算法对边缘进行分组,以防止对的交错和包含。
用模糊函数对边缘对的特征进行评价,
模糊函数可以用set_fuzzy_measure , set_fuzzy_measure_norm_pair来设置。
通过参数fuzzythresh可以确定选择哪一对边,fuzzythresh构成了所有模糊集的权重阈值,即定义的模糊函数权重的几何平均值。
所选的边作为单点返回,单点位于矩形或环形圆弧的主轴上。
对应的边缘振幅在 AmplitudeFirst , AmplitudeSecond,返回,
模糊分数在FuzzyScore返回。
此外,每个边缘对之间的距离在intrdistance中返回,
相邻边缘对之间的距离在InterDistance中返回。
其中IntraDistance对应EdgeFirst与edgeecond 之间的距离,
InterDistance对应edgeecond 与EdgeFirst[i+1]之间的距离,即,元组间距离包含的元素比边对的元组少一个。
3.reset_fuzzy_measure( : : MeasureHandle, SetType : )
reset_fuzzy_measure丢弃模糊集SetType 的模糊函数。
这个函数以前应该是由set_fuzzy_measure设置。
4.fuzzy_measure_pairing(Image : : MeasureHandle, Sigma, AmpThresh, FuzzyThresh, Transition, Pairing, NumPairs : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, RowPairCenter, ColumnPairCenter, FuzzyScore, IntraDistance)
fuzzy_measure re_pairing用于提取垂直于矩形或环形圆弧主轴的直线边缘对。
fuzzy_measure_pairing的提取算法与fuzzy_measure_pair(详见上面介绍)相同,
但有一个例外,即也可以使用参数Pairing提取交错和包含的对。
目前只有“no_constraint”可用,它返回所有可能的边缘对,允许交叉和包含对。
只返回得分最高的数对边缘对,而0表示返回所有可能找到的边缘组合。
所选的边作为单点返回,单点位于矩形或环形圆弧的主轴上。
对应的边缘振幅在 AmplitudeFirst, AmplitudeSecond返回,
模糊分数在 FuzzyScore返回。
每个边缘对之间的距离在intrdistance中返回,
对应于EdgeFirst和EdgeSecond之间的距离。
5.set_fuzzy_measure_norm_pair( : : MeasureHandle, PairSize, SetType, Function : )
set_fuzzy_measure re_norm_pair指定传入函数的规范化模糊函数。
指定的模糊函数使
fuzzy_measure_pos、
fuzzy_measure_pair
fuzzy_measure_pairing
能够对检测到的候选边和边缘对进行评估和选择。
为此目的,不同边缘特征的加权特征可以由每个函数定义。
这样一个指定的特征称为模糊集。
如果没有为模糊集指定函数,就意味着不能使用该特征进行最终的边缘评估。
将第二个模糊函数设置为模糊集意味着丢弃第一个定义的函数,并用第二个函数替换它。
与set_fuzzy_measure不同的是,这些函数的横坐标x必须相对于所需的边缘对大小s来定义(以对大小传递)。
这支持对定义函数的通用使用。
通过reset_fuzzy_measure可以完全丢弃以前定义的归一化模糊函数。
可定义由SetType参数选择的三种不同模糊集类型的函数,集合的子类型相互排斥:
“size”表示一个模糊集,该模糊集以像素为单位计算一对边的归一化距离:
工业视觉一维模糊测量函数介绍2
通过使用相应的模糊值0.0结束函数来指定大小的上限x_max将加快fuzzy_measure_pair / fuzzy_measure_pairing,
因为并不是所有可能的对都必须考虑。
此外,这个模糊集还可以通过'size_diff'指定为规范化的大小差异。
工业视觉一维模糊测量函数介绍3
以及size_abs_diff的绝对规格化大小差异
工业视觉一维模糊测量函数介绍4
position模糊函数计算每个边缘候选点到测量对象参考点的符号距离p,
由gen_measure re_arc或gen_measure re_rectangle2生成:
工业视觉一维模糊测量函数介绍5
参考点位于起点,而“position_center”或“'position_end' ”将参考点设置为一维灰度值轮廓的中间或末端。
如果模糊位置评估取决于沿着轮廓position-first-edge/position-last-edge的对象位置,
则将参考点设置在第一个/最后一个提取的边的位置。
在提取边缘对时,一对边的位置由两条边的模糊位置分数的几何平均值来引用。
归一化模糊函数定义为由至少两对值组成的分段线性函数,按x值的升序排列。
模糊函数的y值表示对应特征值的权重,必须满足0.0 <= y <= 1.0的范围。
在函数的区间之外,由最小和最大的x值定义,区间边界的y值不断地延续。
这样的模糊函数可以由create_funct_1d_pair生成。
5.fuzzy_measure_pos(Image : : MeasureHandle, Sigma, AmpThresh, FuzzyThresh, Transition : RowEdge, ColumnEdge, Amplitude, FuzzyScore, Distance)
fuzzy_measure re_pos提取垂直于矩形或环形圆弧主轴的直线边缘。除了measure re_pos,它还使用模糊函数来评估和选择边缘。
模糊测量算法的工作原理是对垂直于矩形或环形弧长轴的“切片”中的灰度值进行平均,以获得一维边缘轮廓。
采样是在图像的亚像素位置,从矩形中心开始,以整数行和列的距离(在矩形的坐标框中)进行的。
由于这涉及到一些可以在多个测量中重复使用的计算,因此 gen_measure_rectangle2仅用于执行这些计算一次,
从而显著提高fuzzy_measure_pos的速度。
由于在灰度值的亚像素计算中存在精度和速度之间的权衡,因此在提取边缘位置的精度方面,
可以在 gen_measure_rectangle2.中选择不同的插值方案。
(插值只影响不与图像轴和环形弧对齐的矩形。)
gen_measure_rectangle2生成的测量对象为measurehandle。
在计算一维边缘轮廓后,通过将轮廓与标准差sigma的高斯平滑核的导数卷积来计算亚像素边缘位置。
突出的边缘可以通过参数ampthresh来选择,该参数构成对振幅的阈值,即边缘的一阶导数的绝对值。
此外,
可以只选择正边,即在矩形长轴方向上构成暗到亮过渡的边(transition='positive'),
或负边,即亮到暗过渡(transition='negative'),
或同时选择两种边(transition='all')。
最后,可以选择返回哪些边缘点。
在提取亚像素边缘位置后,利用相应的模糊函数对这些边缘的特征进行评估,该模糊函数可以通过设置模糊测度来设置。
选择哪些边可以用参数fuzzythresh来确定,该参数构成所有模糊集的权重阈值,即定义集权重的几何平均值。
所选边作为单点返回,该点位于矩形或环形弧的长轴上,in(rowedge,columnedge)。
相应的边缘振幅以振幅的形式返回,模糊分数以模糊核心的形式返回。
此外,连续边缘点之间的距离以距离返回。
这里,距离对应于边和边[i+1]之间的距离,
即tuple距离包含一个小于tuples rowedge和columnedge的元素。
下面是前面介绍的几个函数的具体使用例程
这个示例程序演示了模糊度量对象的基本用法。
任务是确定活动扳手脚的宽度和距离,如图,在红色框内执行距离与宽度的检测
工业视觉一维模糊测量函数介绍1
开始 使用函数measure_pairs不能正常检测,
后面分别使用了模糊检测函数fuzzy_measure_pairs,
fuzzy_measure_pairing
fuzzy_measure_pos
都可以正确检测出扳手的间距与宽度,结果如图
工业视觉一维模糊测量函数介绍
下面是整个例程代码:
- read_image (Image, 'bin_switch/bin_switch_2')
- get_image_size (Image, Width, Height)
- dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
- dev_resize_window_fit_size (0, 0, Width, Height, -1, 640)
- dev_set_draw('margin')
- * 定义测量区域
- Row := 290
- Column := 170
- Phi := rad(-130)
- Length1 := 60
- Length2 := 10
- Interpolation := 'nearest_neighbor'
- gen_rectangle2 (Rectangle1, Row, Column, Phi, Length1, Length2)
- dev_display (Image)
- dev_display (Rectangle1)
- gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, Interpolation, MeasureHandle)
- *确定所有具有负转换的边缘对,即黑暗区域的边缘对。
- Sigma := 1.1
- Threshold := 20
- Transition := 'negative'
- Select := 'all'
- measure_pairs (Image, MeasureHandle, Sigma, Threshold, Transition, Select, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
- * 结果显示
- p_disp_dimensions (RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond, IntraDistance, InterDistance, Phi, Length2, WindowHandle)
- stop ()
- * 由于中间脚的反射,无法正确确定其宽度。
- *我们知道引脚大约有9个像素宽,因此很容易将度量扩展为模糊度量,只返回宽度近似于给定大小的边缘对。
- *首先,创建一个模糊函数,对于给定的对大小返回1.0,对于与给定的对大小偏离2个像素以上的值返回0.0。
- create_funct_1d_pairs ([7,9,11], [0.0,1.0,0.0], SizeFunction)
- * 然后,将度量扩展为一个模糊度量,它将只返回大约给定大小的对
- SetType := 'size'
- set_fuzzy_measure (MeasureHandle, SetType, SizeFunction)
- * 最后,确定所有具有负转换和近似给定大小的边缘对, 再将结果显示出来,使用函数fuzzy_measure_pairs
- Sigma := 1.1
- AmpThresh := 20
- FuzzyThresh := 0.5
- Transition := 'negative'
- fuzzy_measure_pairs (Image, MeasureHandle, Sigma, AmpThresh, FuzzyThresh, Transition, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, RowEdgeCenter, ColumnEdgeCenter, FuzzyScore, IntraDistance, InterDistance)
- p_disp_dimensions (RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond, IntraDistance, InterDistance, Phi, Length2, WindowHandle)
- *使用函数fuzzy_measure_pairing
- fuzzy_measure_pairing (Image, MeasureHandle, Sigma, AmpThresh, FuzzyThresh, Transition, 'no_restriction', 10, RowEdgeFirst1, ColumnEdgeFirst1, AmplitudeFirst1, RowEdgeSecond1, ColumnEdgeSecond1, AmplitudeSecond1, RowPairCenter, ColumnPairCenter, FuzzyScore1, IntraDistance1)
- p_disp_dimensions (RowEdgeFirst1, ColumnEdgeFirst1, RowEdgeSecond1, ColumnEdgeSecond1, IntraDistance1, InterDistance, Phi, Length2, WindowHandle)
- *使用函数fuzzy_measure_pos
- reset_fuzzy_measure (MeasureHandle, SetType)
- set_fuzzy_measure_norm_pair (MeasureHandle, 10, SetType, SizeFunction)
- fuzzy_measure_pos (Image, MeasureHandle, Sigma, AmpThresh, FuzzyThresh, Transition, RowEdge, ColumnEdge, Amplitude, FuzzyScore2, Distance)
- gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 6, 0.785398)
- dev_set_color ('red')
- dev_display (Cross)
- *释放资源
- close_measure (MeasureHandle)
复制代码
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|