QQ登录

只需一步,快速开始

工业视觉一维模糊测量函数介绍

[ 复制链接 ]
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

工业视觉一维模糊测量函数介绍2

通过使用相应的模糊值0.0结束函数来指定大小的上限x_max将加快fuzzy_measure_pair / fuzzy_measure_pairing,
因为并不是所有可能的对都必须考虑。
此外,这个模糊集还可以通过'size_diff'指定为规范化的大小差异。

工业视觉一维模糊测量函数介绍3

工业视觉一维模糊测量函数介绍3

以及size_abs_diff的绝对规格化大小差异

工业视觉一维模糊测量函数介绍4

工业视觉一维模糊测量函数介绍4

position模糊函数计算每个边缘候选点到测量对象参考点的符号距离p,
由gen_measure re_arc或gen_measure re_rectangle2生成:

工业视觉一维模糊测量函数介绍5

工业视觉一维模糊测量函数介绍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

工业视觉一维模糊测量函数介绍1


开始 使用函数measure_pairs不能正常检测,
后面分别使用了模糊检测函数fuzzy_measure_pairs,
fuzzy_measure_pairing
fuzzy_measure_pos
都可以正确检测出扳手的间距与宽度,结果如图

工业视觉一维模糊测量函数介绍

工业视觉一维模糊测量函数介绍

下面是整个例程代码:
  1. read_image (Image, 'bin_switch/bin_switch_2')
  2. get_image_size (Image, Width, Height)
  3. dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
  4. dev_resize_window_fit_size (0, 0, Width, Height, -1, 640)
  5. dev_set_draw('margin')
  6. * 定义测量区域
  7. Row := 290
  8. Column := 170
  9. Phi := rad(-130)
  10. Length1 := 60
  11. Length2 := 10
  12. Interpolation := 'nearest_neighbor'
  13. gen_rectangle2 (Rectangle1, Row, Column, Phi, Length1, Length2)
  14. dev_display (Image)
  15. dev_display (Rectangle1)
  16. gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, Interpolation, MeasureHandle)
  17. *确定所有具有负转换的边缘对,即黑暗区域的边缘对。
  18. Sigma := 1.1
  19. Threshold := 20
  20. Transition := 'negative'
  21. Select := 'all'
  22. measure_pairs (Image, MeasureHandle, Sigma, Threshold, Transition, Select, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
  23. * 结果显示
  24. p_disp_dimensions (RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond, IntraDistance, InterDistance, Phi, Length2, WindowHandle)
  25. stop ()
  26. * 由于中间脚的反射,无法正确确定其宽度。
  27. *我们知道引脚大约有9个像素宽,因此很容易将度量扩展为模糊度量,只返回宽度近似于给定大小的边缘对。
  28. *首先,创建一个模糊函数,对于给定的对大小返回1.0,对于与给定的对大小偏离2个像素以上的值返回0.0。
  29. create_funct_1d_pairs ([7,9,11], [0.0,1.0,0.0], SizeFunction)
  30. * 然后,将度量扩展为一个模糊度量,它将只返回大约给定大小的对
  31. SetType := 'size'
  32. set_fuzzy_measure (MeasureHandle, SetType, SizeFunction)
  33. * 最后,确定所有具有负转换和近似给定大小的边缘对, 再将结果显示出来,使用函数fuzzy_measure_pairs
  34. Sigma := 1.1
  35. AmpThresh := 20
  36. FuzzyThresh := 0.5
  37. Transition := 'negative'
  38. fuzzy_measure_pairs (Image, MeasureHandle, Sigma, AmpThresh, FuzzyThresh, Transition, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, RowEdgeCenter, ColumnEdgeCenter, FuzzyScore, IntraDistance, InterDistance)
  39. p_disp_dimensions (RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond, IntraDistance, InterDistance, Phi, Length2, WindowHandle)
  40. *使用函数fuzzy_measure_pairing
  41. fuzzy_measure_pairing (Image, MeasureHandle, Sigma, AmpThresh, FuzzyThresh, Transition, 'no_restriction', 10, RowEdgeFirst1, ColumnEdgeFirst1, AmplitudeFirst1, RowEdgeSecond1, ColumnEdgeSecond1, AmplitudeSecond1, RowPairCenter, ColumnPairCenter, FuzzyScore1, IntraDistance1)
  42. p_disp_dimensions (RowEdgeFirst1, ColumnEdgeFirst1, RowEdgeSecond1, ColumnEdgeSecond1, IntraDistance1, InterDistance, Phi, Length2, WindowHandle)
  43. *使用函数fuzzy_measure_pos
  44. reset_fuzzy_measure (MeasureHandle, SetType)
  45. set_fuzzy_measure_norm_pair (MeasureHandle, 10, SetType, SizeFunction)
  46. fuzzy_measure_pos (Image, MeasureHandle, Sigma, AmpThresh, FuzzyThresh, Transition, RowEdge, ColumnEdge, Amplitude, FuzzyScore2, Distance)
  47. gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 6, 0.785398)
  48. dev_set_color ('red')
  49. dev_display (Cross)
  50. *释放资源
  51. close_measure (MeasureHandle)
复制代码

  

halcon从自学到接项目视频教程,另外再赠送全网最全资源  

  

欢迎围观我录制的一套halcon自学视频教程(进入)


  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  




回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索