Halcon 一维卡尺测量找点之模糊集测量法
模糊测量是对标准测量的一种扩展,并不意味着测量是“模糊的”,而是用模糊隶属函数来控制边缘的选择。所谓的模糊隶属函数,就是将边缘的特征值转换为隶属度值,基于这些隶属值做出是否选择边缘的决定,即当隶属值大于你设定模糊阈值时,边缘就会被选中,反之则反。这种方法的优点是即使使用很低的最小阈值或平滑,也能灵活处理额外的边缘。
常规操作流程为1创建模糊函数,2指定模糊函数,3执行测量
1,创建模糊函数
create _ funct _ ld _ pairs (:: XValues , YValues : Function )
功能:通过二维数组创建一个离散一维函数,即生成模糊函数。
XValues :函数点的 x 值,指边缘特征。
YValues :函数点的 y 值,指相应特征值的权重,0< y <1。
Function :已创建的模糊函数。
2,指定模糊函数
1)set _ fuzzy _ measure (: MeasureHandle , SetType , Function :)
功能:指定一个模糊函数。
SetType :选择模糊集。
模糊集使得 fuzzy _ measure _ pos 和 fuzzy _ measure _ pairs / fuzzy _ measure _ pairing 算子够评估和选择检测到的候选边缘,主要有以下五种类型模糊集(其中 position _ pair 、 site gary 仅由 fuzzy _ measure _ pairs / fuzzy _ measure _ pairing 算子使用):
① contrast :使用模糊函数来评估候选边缘的振幅(一阶导数值)。在提取边缘对时,通两条边缘振幅的模糊分数的几何平均值来获得模糊评估。
② position :使用模糊函数评估每个候选边缘到测量对象的参考点的距离,参考点为量对象轮廓线的起点。而 position _ center 或 position _ end 将参考点设置为轮廓线的中点末端; position _ first _ edge / position _ last _ edge 将参考点设置为第一个/最后提取的边缘的置。当提取边缘对时,通过两条边缘位置的模糊分数的几何平均值来获得模糊评估。
③ position _ pair :与 position 相似,计算每个边缘对的中心点与测量对象的参考点之间距离。参考点可以分别由 position _ pair _ center , position _ pair _ end 和 position first _ paits,position _ last _ pair 来设置。
④ size :以像素为单位,用模糊函数评估边缘对内两条边缘的规定距离。
⑤ gray :使用模糊函数评估边缘对的两个边缘之间的平均投影灰度值。
2)set _ fuzzy _ measure _ norm _ pair (:: MeasureHandle . PairSize . SetType , Function :)
功能:设置归一化的模糊隶属度函数,与 set _ fuzzy _ measure 算子不同,这些函数的横
坐标 x 必须由边缘对的预期宽度 s (在参数 PairSize 中传递)来定义。
PairSize :边缘对的预期宽度。
SetType :选择模糊集。选择模糊集主要有如下三种类型,即 size , position 和 position - pair .其中 position _ pair 仅由 fuzzy _ measure _ pairs 和 fuzzy _ measure _ pairing 算子使用
size 模糊集以像素为单位,用模糊函数评估边缘对内两条边缘的归一化距离。这个模糊集也可以通过 size _ diff 指定为归一化的大小差异,或通过 size _ abs _ diff 指定为绝对归一化大小差异。另外两个模糊集 position 和 position _ pair 参考算子 set _ fuzzy _ measure 参数详解。
3,执行测量
1)fuzzy _ measure _ pos ( Image :: MeasureHandle , Sigma , AmpThresh , FuzzyThresh , Transition :
RowEdge , ColumnEdge , Amplitude , FuzzyScore , Distance )
功能:提取垂直于矩形或扇环的直边,与 measure _ pos 不同的是,该算子使用模糊函数来判断和选择边缘 AmpThresh :最小的边缘梯度阈值,即边缘的一阶导数绝对值大于该值才会被选中。 FuzzyThresh :最小模糊阈值,即权重的几何平均值大于该值,边缘才会被选中。 RowEdge 、 ColumnEdge :边缘点的行、列坐标。
Amplitude :边缘梯度幅值(带符号),即一阶导数值。
FuzzyScore :边缘模糊评估的分数
2)fuzzy _ measure _ pairs ( Image .: MeasureHandle , Sigma , AmpThresh , FuzzyThresh . Transition :
RowEdgeFirst , ColumnEdgeFirst , AmplitudeFirst , RowEdgeSecond , ColumnEdgeSecond , AmplitudeSecond ,
RowEdgeCenter , ColumnEdgeCenter , FuzzyScore , IntraDistance , InterDistance )
功能:提取垂直于矩形或扇环的直边对,与 measure _ pairs 不同的是,该算子使用模糊函数来判断和选择边缘对。
RowEdgeCenter 、 ColumnEdgeCenter :边缘对的中心行、列坐标。
3) fuzzy _ measure _ pairing ( Image :: MeasureHandle , Sigma . AmpThresh , FuzzyThresh . Transition , Pairing , NumPairs : RowEdgeFirst , ColumnEdgeFirst , AmplitudeFirst , RowEdgeSecond , ColumnEdge - Second , AmplitudeSecond , RowPairCenter , ColumnPairCenter , FuzzyScore , IntraDistance )
功能:提取垂直于矩形或扇环的直边对。提取算法与 fuzzy _ measure _ pairs 相同,但该算子可以使用参数 Pairing 来提取彼此相交或者包含的边缘对。
Pairing :配对约束。
NumPairs :返回边缘对的数量。
RowPairCenter 、 ColumnPairCenter :边缘对的中心行、列坐标。
案例:
read_image (Image1, 'E:/Halcon数据/资源图片/123.png')rgb1_to_gray (Image1, Image)get_image_size (Image, Width, Height)
dev_get_window (WindowHandle)
dev_set_draw ('margin')
gen_rectangle2 (ROI_0, 315.308, 506.206, rad(-0.340442), 426.008, 19.2722)
Row := 315.308
Col:= 506.206
Phi := rad(-0.340442)
Length1 := 426.008
Length2 := 19.2722
gen_measure_rectangle2 (Row, Col, Phi, Length1, Length2, Width, Height, 'nearest_neighbor', MeasureHandle)
create_funct_1d_pairs ([40,75,110], [0.5,1.0,0.1], FuzzyAbsSizeDiffFunction)
* set_fuzzy_measure_norm_pair (MeasureHandle, 3, 'position_pair_end', FuzzyAbsSizeDiffFunction)
set_fuzzy_measure (MeasureHandle, 'size', FuzzyAbsSizeDiffFunction)
fuzzy_measure_pairs (Image, MeasureHandle, 1, 30, 0.5, 'all', RowEdgeFirst1, ColumnEdgeFirst1, AmplitudeFirst1, RowEdgeSecond1, ColumnEdgeSecond1, AmplitudeSecond1, RowEdgeMiddle1, ColumnEdgeMiddle1, FuzzyScore1, IntraDistance1, InterDistance1)
PRows:=[RowEdgeFirst1,RowEdgeSecond1]
PCols:=[ColumnEdgeFirst1,ColumnEdgeSecond1]PSize := Length2 * 0.5
RowStart := Row + sin(Phi) * Length1
RowEnd := Row - sin(Phi) * Length1
ColStart := Col - cos(Phi) * Length1
ColEnd := Col + cos(Phi) * Length1
for idx := 0 to |PRows| - 1 by 1gen_contour_polygon_xld (CPoint, [PRows[idx] - sin(rad(90) + Phi) * PSize,PRows[idx] - sin(Phi - rad(90)) * PSize], [PCols[idx] + cos(rad(90) + Phi) * PSize,PCols[idx] + cos(Phi - rad(90)) * PSize])dev_set_color ('red')dev_set_line_width (3)dev_display (CPoint)
endforfor I := 0 to |ColumnEdgeFirst1| - 1 by 1MRow := (RowEdgeSecond1[I] +RowEdgeFirst1[I])/2MCol := (ColumnEdgeSecond1[I] +ColumnEdgeFirst1[I])/2dev_set_color ('white')gen_cross_contour_xld (Cross, MRow , MCol, 10, 0)dev_display (Cross)disp_message (WindowHandle, Pin, 'image', MRow-20 , MCol, 'black', 'false')Pin := Pin + 1disp_message (WindowHandle, IntraDistance1[I]$'.2f' +'Pix,'+ ' score:' + FuzzyScore1[I]$'.2f', 'image', MRow+10, MCol-30, 'black', 'false')endfor