基本上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)
由它測量出來的邊界都是成對存在的。