1. 程式人生 > >Halcon常用運算元整理

Halcon常用運算元整理

常用運算元

Fast detection of lane markers

dev_update_window(: : DisplayMode: ) :預設狀態下執行產生的所有的物件(影象,區域,或XLD)都在活動圖形視窗顯示。可以用OFF關閉此模式,預設值為off(不支援C++程式碼),因為這會拖慢程式執行的速度,我們需要的只是最終的結果。

dev_display(Operator)顯示image,region等變數,當先輸出image在輸出region變數時,image可以被覆蓋

get_system(: : Query: Information) 返回關於當前啟用的halcon系統引數。例如查詢當前處理器的核心數get_system('processor_num',Information)。獲得資訊的目的是為了再set_system,保持系統引數不變。

dev_open_window(左上角開始行數,左上角開始列數,視窗的寬,視窗的高,視窗的背景顏色,視窗識別符號(輸出));建立一個視窗

gen_grid_region(建立線或者畫素區域名(輸出),行方向的間隔,列方向的間隔,型別線或者畫素,線的橫向長度,列向長度);建立一個域。直線或者畫素組成

clip_region(畫的影象:被畫的影象(輸出):畫的影象的矩形左上角的行座標,列座標,矩形右下角的行座標,列座標)  ;將域進行固定

read_image(影象名字(輸出),檔名字);

reduce_domain(輸入的影象,新的影象域,有新影象域的影象(輸出))  減少影象域

sobel_amp(被處理的影象,處理後的影象:濾波型別,梯度大小) sobel 運算元

根據選擇的不同濾波器型別,使用的模板也不同,a,b分別表示和濾波模A,B板卷積之後單個畫素的值

'sum_sqrt'              sqrt(a^2 + b^2) / 4                         

'sum_abs'           (|a| + |b|) / 4

'thin_sum_abs'          (thin(|a|) + thin(|b|)) / 4

'thin_max_abs'          max(thin(|a|),thin(|b|)) / 4

'x'                     b / 4

'y'                     a / 4

thin(x)分別表示一個垂直最大值(垂直方向只取一個最大)(模板A)和一個水平最大值(模板B),否則就是0.因此對於thin_sum_abs和thin_max_abs梯度影象的邊緣就變細了。不同濾波處理方式如圖處理結果如圖。

threshold(被處理影象,分割後的域:最小的灰度值,最大的灰度值)  返回  min<= >=max的那部分影象

dilation_rectangle1(要擴張的區域,擴張後的影象,矩形的寬,矩形的高)以檢測出的點為中心進行矩形擴張

fill_up(檢測的影象域,檢測後的影象域)把區域中檢測到的不一樣顏色的孔進行著色(預設是八鄰域檢測)

skeleton(:: : ) 

skeleton運算元計算區域內的骨架,也就是輸入區域的中軸線。在骨架上的每一個點可以被看做圓的中心點,並且有儘可能大的半徑,但是仍然被完全包含在區域裡。

Region是被變細的區域;Skeleton是結果骨架

有關此方法具體可以參考Eckardt,U. “Verdünnungmit Perfekten Punkten”,Proceedings 10. DAGM-Symposium, IFB 180, Zurich, 1988。

sobel_dir(Image:EdgeAmplitude, EdgeDirection: FilterType, Size: )

用Sobel運算元檢測邊緣(幅度(梯度向量的長度)和方向)

sobel_dir計算影象的一階導數並且被用來當做邊緣檢測器。濾波器基於下面的濾波模板來模擬一階導數

 A =                                

1       2      1

0       0      0

-1      -2     -1

B=

1       0     -1

2       0     -2

1       0     -1

根據選擇的不同的濾波型別,使用不同的濾波模板。(下面的式子a,b表示用模板A,B和影象進行卷積的結果,表示一個特定的畫素值)

'sum_sqrt'              sqrt(a^2 + b^2) / 4

'sum_abs'               (|a| + |b|) / 4

對於一個3x3大小的Sobel運算元,分別直接應用A,B模板進行檢測就可以了。如果要使用大一些尺寸的濾波器首先要進行高斯濾波或者二項式濾波。高斯濾波器必須使用如下所示的濾波型別。並且此存只可以是5,7,9,13。二項式濾波器通過在FilterType後面新增"_binomaial"。它的尺寸可以使用3到39中任何一個值。並且它可以通過兩個Size引數選擇不同數量的行和列方向進行平滑,,第一個Size引數表示模板的寬(在列的方向平滑,也就是行),第二個Size引數表示模板的高(在行的方向進行平滑,也就是列)。二值濾波器只可以用在位元組型別的影象上,uint2和real。因為平滑濾波減小了邊緣幅度,在這種情況下邊緣幅度乘以2以減少資訊的丟失。因此

sobel_dir(I,Amp,Dir,FilterType,S)

forSize > 3 在概念上等於

scale_image(I,F,2,0)

gauss_image(F,G,S-2)

sobel_dir(G,Amp,Dir,FilterType,3)

或者

scale_image(I,F,2,0)

binomial_filter(F,G,S[0]-2,S[1]-2)

sobel_dir(G,Amp,Dir,FilterType,3).

邊緣方向返回值放在EdgeDirection中,並且分兩步儲存,例如一個邊緣方向為在正方向相對於x軸為x度並且在邊緣方向影象中儲存x/2。並且在強度變化的方向也被考慮在其中,用[Ex,Ey]表示梯度方向。下面的邊緣方向作為r/2返回:

intensityincrease                     Ex / Ey        edge direction r

frombottom to top                      0 /+         0

fromlower right to upper left          - /+         ]0,90[

fromright to left                      - /0         90

fromupper right to lower left          - /-         ]90,180[

fromtop to bottom                      0 /-         180

fromupper left to lower right          + /-         ]180,270[

fromleft to right                      + /0         270

fromlower left to upper right          + /+         ]270,360[.

邊緣幅度為0的點被標記為邊緣方向255(未定義方向)

Sobel_amp可以在OpenCL裝置上執行。注意當用高斯濾波器模板尺寸大於三,結果可以在不同CPU中實現

引數:

Image(input_object)  (multichannel-)image(-array) →object(byte / int2 / uint2 / real)

Inputimage.

EdgeAmplitude(output_object)  (multichannel-)image(-array) →object(byte / int2 / uint2 / real)

Edgeamplitude (gradient magnitude) image.

EdgeDirection(output_object)  (multichannel-)image(-array) →object(direction)

Edgedirection image.

FilterType(input_control)  string →(string)

Filtertype.

Defaultvalue: 'sum_abs'

Listof values: 'sum_abs', 'sum_sqrt', 'sum_abs_binomial', 'sum_sqrt_binomial'

Listof values (for compute devices): 'sum_abs', 'sum_sqrt', 'sum_abs_binomial','sum_sqrt_binomial'

Size(input_control)  integer(-array) →(integer)

Sizeof filter mask.

Defaultvalue: 3

Listof values: 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37,39

difference(Region,Sub: RegionDifference: :) 計算兩個Region中的不同(Regionsin Region)- (Regions in Sub)

Region(input_object)  region(-array) →object

Regionsto be processed.

Sub(input_object)  region(-array) →object

Theunion of these regions is subtracted from Region.

RegionDifference(output_object)  region(-array) →object

Resultingregion.

計算結果就是除去Region中存在於Sub中的點。Notethat, internally, all regions of Sub are united to a single region before thedifferences between the individual regions of Region and the united region arecalculated.

對於上述兩個輸入引數,空域是合法的。在輸出中,也許會出現空域的結果。

shape_trans(Region:RegionTrans: Type: )  改變區域的形狀

Region(input_object)  region(-array) →object

Regionsto be transformed.

RegionTrans(output_object)  region(-array) →object

Transformedregions.

Type(input_control)  string →(string)

Typeof transformation.

Defaultvalue: 'convex'

Listof values: 'convex', 'ellipse', 'outer_circle', 'inner_circle', 'rectangle1','rectangle2', 'inner_rectangle1', 'inner_center'

根據Type的型別來改變輸入區域的影象:

'convex'  凸包

'ellipse'橢圓

'outer_circle'最小包容圓

'inner_circle'最大的內部圓

'rectangle1'平行於座標系的最小的包圍矩形

'rectangle2'最小包圍矩形

'inner_rectangle1'最大的平行於座標系的內部矩形

'inner_center'輸入區域骨架上的離區域中心最近的點

dilation_circle(Region:RegionDilation: Radius: )用圓的結構化區域膨脹一個區域

運算元應用一個Minkowski和一個圓形結構元素相加作用於輸入域Region。由於圓模板是對稱的,所以膨脹也是對稱的。作為結構元素的圓的尺寸是由引數Radius決定的。

這個運算元返回一個擴大的區域,平滑的邊界,並且在區域內部的小於圓模板的洞被封閉了。

Itis useful to select only values like 3.5, 5.5, etc. for Radius in order toavoid a translation of a region, because integer radii result in the circlehaving a non-integer center of gravity which is rounded to the next integer.

create_variation_model(: : Width, Height, Type, Mode: ModelID) 為影象對比建立一個變化模型

Width(input_control)  extent.x →(integer)

Widthof theimages to be compared.

Defaultvalue:640

Suggestedvalues:160, 192, 320, 384, 640, 768

Height(input_control)  extent.y →(integer)

Heightof theimages to be compared.

Defaultvalue:480

Suggestedvalues:120, 144, 240, 288, 480, 576

Type(input_control)  string →(string)

Typeof theimages to be compared.

Defaultvalue:'byte'

Suggestedvalues:'byte', 'int2', 'uint2'

Mode(input_control)  string →(string)

Methodused forcomputing the variation model.

Defaultvalue:'standard'

Suggestedvalues:'standard', 'robust', 'direct'

ModelID(output_control)  variation_model →(integer)

IDof thevariation model.

通常情況下變數模型用來把好的物件和不好的物件區分出來。它假設這個區分可以只通過物件的灰度值實現。

變數模型包含一個物件的理想影象,這個理想影象是用compare_variation_model或者compare_ext_variation_model來進行比較的,並且影象代表了物件上每一點的灰度值數量變化。影象和訓練的物件模型以及後來用來用來對比的模型的大小都是由Width和Height引數確定的。用來訓練和比較的影象型別是通過引數Type來確定的。

變化模型是用多個合格的影象來訓練的。因此,訓練影象在同一位置和角度來顯示物件時很重要的。如果不能通過外部方法保證上述條件,那麼物件的姿勢可以用匹配(matching)來決定(見find_shape_model)。影象可以通過affine_trans_image轉換成一個參考姿勢。

     引數Mode用來決定理想的影象物件和相應的變化影象的計算模式。當Mode=’standard’,理想的影象物件(theidealimage of the object)(為計算變化影象做準備)是訓練影象在各自的影象位置求平均的結果。相應的變化影象是訓練影象在各自影象位置的標準差(standarddeviation)。這個模式的優點就是可以迭代的進行訓練,例如,只要是一個好的物件時可用的,那麼就可以用train_variation_model來進行訓練。但是這樣做的缺點就是要注意訓練的圖相是好影象,因為平均標準方差對於其它圖相沒有魯棒性,例如,如果一個差影象不小心被放入到訓練影象中,理想影象物件的精度和變化影象可能會退化。

     如果變化模型在訓練時不可避免的要參雜一些包含錯誤的影象,那麼引數Mode可以設定為’robust’。在這種模式下,理想的影象物件是這些所有訓練影象的在各自位置的中間值。相應的變化影象是訓練影象和中值影象再各自影象位置的一個合適尺度的絕對中值偏差。這種模式的優點是對於差影象是魯棒的。缺點就是它不能迭代的進行訓練,例如,所有的訓練影象必須用concat_obj累積並且被train_variation_model一次性訓練。

     在一些情況下很難獲得多個訓練影象。在這種情況下,不可以通過單個訓練影象獲得有用的變化影象。為了解決這個問題,變化影象可以被綜合的創造,例如,通過使用灰度值形態學方法(gray_erosion_shapeand gray_dilation_shape)把訓練影象按行或者列方向移動+/- 1畫素,然後再綜合修正影象。其他的一種方法是使用引數Mode=’direct’。在這種情況下,變數模型變化模型只可以用prepare_direct_variation_model直接指定理想影象和變化影象。因為在物件的邊緣變化比較劇烈,應當使用邊緣運算元像soble_amp,edges_image,或者gray_rang_rect來建立變化影象。

inspect_shape_model(Image(input_object):ModelImages(output_object), ModelRegions(output_object)  : NumLevels(input_control), Contrast  (input_control): )  建立一個形狀模型的表示

Image(input_object)  (multichannel-)image →object (byte / uint2)

Inputimage.

ModelImages(output_object) (multichannel-)image-array → object(byte /uint2)

Imagepyramid of the input image

ModelRegions(output_object)  region-array →object

Modelregion pyramid

NumLevels(input_control)  integer →(integer)

Numberof pyramid levels.

Defaultvalue: 4

Listof values: 1, 2, 3, 4, 5, 6, 7, 8,9, 10

Contrast(input_control)  number(-array) →(integer)

Thresholdor hysteresis thresholds forthe contrast of the object in the image andoptionally minimum size of theobject parts.

Defaultvalue: 30

Suggestedvalues: 10, 20, 30, 40, 60,80, 100, 120, 140, 160

為了決定引數Numlevels和Contrast運算元inspect_shape_model特別有用,這兩個引數可以快速方便的用在create_shape_model,create_scaled_shape_model,or create_aniso_shape_model上。模型表象基於多個影象金字塔層建立,這個層數被引數NumLevels決定,為了和create_shape_model,create_scaled_shape_model,and create_aniso_shape_model做對比,這個模型只用來對輸入的物件進行旋轉或者設定尺度,例如0度和1。作為輸出,運算元建立輸出一個影象物件ModeImages包含每一個影象金字塔層和一個區域(Region)ModelRegions代表每一個金字塔層模型。每一個物件可以通過select_obj訪問。如果輸入的影象Image是單通道的,那麼這個方法創造的模型用在create_shape_model,create_scaled_shape_modelor create_aniso_shape_model方法中它們的引數metrics只可用'use_polarity','ignore_global_polarity',and 'ignore_local_polarity'。如果輸入影象時多通道那麼引數用'ignore_color_polarity'。就像方法create_shape_model,create_scaled_shape_model,and create_aniso_shape_model,描述的那樣,金字塔層的個數應該是越大越好,但是考慮到模型必須在金字塔的最高層是可以辨認的並且必須有足夠的模型點。引數Contrast要滿足那些對於模板物件有意義的特徵用在模型上。Contrast可以是一個tuple包含兩個值。在這種情況下,模型使用一個像用在edges_image那樣的滯後閾值法分割。在這裡,tuple裡的第一個值是小閾值,第二個是大閾值。(關於更多的滯後閾值法參見hysteresis_threshold)。Contrast還可以包含一個第三個值作為tuple的最後一個元素。這個值根據部分的大小決定一個挑選有意義的模型部分的閾值。例如,這個部分的點數比最小尺寸還要少,那麼就會被抑制。對於每一個連續的金字塔層最小尺寸閾值除以二。如果小的模型部分那就應當被抑制,但是不應當使用滯後閾值分割法,不過這三個值一定要在Contrast中指定。在這種情況下,前連個值可以被設定為相同的值。在這種情況下,inspect_shape_model使用不同的NumLevels和Contrast引數值互動的被呼叫多次,直到獲得了一個滿意的模型。然後create_shape_modelcreate_scaled_shape_model,or create_aniso_shape_model使用那些獲得的引數。