基本上1D Measure都是建立一个ROI
(region of interest,感兴趣区域),然后在感兴趣区域提取出边界的测量。常见的ROI
有矩形ROI
和圆环ROI
。
下图为一个矩形ROI
,中间的Profile Line
为横截线,Center
是行和列的坐标,Phi
指定了它的倾斜角度,Length1
和Length2
指定了它的长宽。
下图为一个圆环ROI
,比较不一样的是它还有一个角度的概念,如伸展角度(angle extent),开始角度(angle start),等。
通常,我们就是要确定在ROI
内,图像中的边界线的具体坐标,怎么确定呢?通常是通过灰度值。如下图a,我们想测试一下管脚的长度,因为管脚本身和背景比起来是比较暗的,因此就可以通过测灰度值的方法将他们区分开来。
怎么测呢?实际上,我们是以Profile Line
为横坐标,在每个横坐标点,做垂线,求得这条垂线上,ROI
内,每个点的坐标的灰度值,取平均,作为这个横坐标点的平均灰度值。这样有管脚的地方,灰度值就会和两边都不一样(一边暗,一边亮)。
看看具体的算子:
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, Interpolation, MeasureHandle)
首先通过gen_measure_rectangle2
生成一个ROI
,这里会产生一个MeasureHandle
,即测量的句柄,用它,就可以告诉其它需要用到这个ROI的算子:"嘿,我构建了一个ROI
,它叫MeasureHandle
要用的话就拿去",Interpolation
代表我们要用插值的方法,找到一些小数位置的灰度值,因为如果ROI不是垂直或水平的,它就可能包含很多坐标是小数的点,这些点本身是没有灰度值定义的,需要通过插值的方法算出来。
measure_pos (Image, MeasureHandle, Sigma, Threshold, Transition, Select, RowEdge, ColumnEdge, Amplitude, Distance)
通过上面得到的MeasureHandle
,当然还有更早得到的Image
,我们再用measure_pos
这个算子,意思是要测量(边缘)的位置。这里Sigma
是进行均值滤波的参数,而要进行均值滤波的原因是,图像上可能会有噪点,影响我们对边缘的判断,用均值滤波平滑掉这些噪点,可以减少误判;Threshold
是阈值,代表阈值超过多少把它当做边缘;Transition
代表是如何转换的,是亮到暗还是暗到亮还是都要;Select
代表可以为first
或last
或all
,意思是你要选你一个还是最后一个还是所有检测到的边缘因为接下来的RowEdge
和ColumnEdge
存储边缘的数组,它可以存储很多的点;Amplitude
指定的是一个缩放,因为工业上还是要测量具体的值的,通过边界的坐标加上缩放的计算,可以计算出确切的距离,就存在Distance
里。
类似的还有measure_pairs
:
measure_pairs (Image, MeasureHandle, Sigma, Threshold, Transition, Select, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
由它测量出来的边界都是成对存在的。