《HALCON數字圖像處理》第四章筆記


我在Gitee上建了個倉庫,會將學習書本的時候打的一些代碼上傳上去,筆記中所有代碼都在倉庫里,初學的朋友可以一起交流哦!地址(Gitee)


第四章 HALCON數據結構

HALCON數據結構主要有圖形參數控制參數兩類

HALCON Image圖像

根據像素點的信息可以分為二值圖像灰度圖像RGB圖像

圖像通道

圖像通道可以看作一個二維數組,每個像素點(r,c)的灰度值可以被解釋為矩陣\(g=f_{r,s}\)的一個元素

HALCON中有關圖像通道的算子:

append_channel(MultiChannelImage, Image : ImageExtended : : )
作用: 將MultiChannelImageImage兩個圖像的通道疊加得到新圖像

decompose3(MultiChannelImage : Image1, Image2, Image3 : : )
作用:轉換三通道圖像為三個單通道灰度圖像

image_to_channels(MultiChannelImage : Images : : )
作用:將多通道圖像轉換為多幅單通道圖像

compose3(Image1, Image2, Image3 : MultiChannelImage : : )
作用:將三個單通道灰度圖像合並為一個三通道彩色圖像

channels_to_image(Images : MultiChannelImage : : )
作用:將多幅單通道圖像合並成一幅多通道彩色圖像

count_channels(MultiChannelImage : : : Channels)
作用:計算圖像的通道數

trans_from_rgb(ImageRed, ImageGreen, ImageBlue : ImageResult1, ImageResult2, ImageResult3 : ColorSpace : )
作用:將彩色圖像從RGB空間轉換到其他顏色空間

get_image_pointer1(Image : : : Pointer, Type, Width, Height)
作用:獲得單通道圖像的指針

get_image_pointer3(ImageRGB : : : PointerRed, PointerGreen, PointerBlue, Type, Width, Height)
作用:獲取多通道圖像的指針

  • 圖像通道程序
* 讀取圖像
read_image (Image, 'claudia.png')
* 計算圖像的通道數
count_channels (Image, Channel_Nums)
* 循環讀取每個通道的圖像
for index := 1 to Channel_Nums by 1
    * 獲取多通道圖像中指定通道的圖像
    access_channel (Image, channel_image, index)
endfor
* 分解通道
decompose3 (Image, imageR, ImageG, ImageB)
* GRB通道轉HSV通道
trans_from_rgb (imageR, ImageG, ImageB, ImageResult1, ImageResult2, ImageResult3, 'hsv')
* 合並通道
compose2 (imageR, ImageG, MultiChannelImage)
* 向圖像添加通道
append_channel (MultiChannelImage, ImageB, ImageExtended)
* 顯示圖像
dev_display (ImageExtended)

運行結果如下圖
image

Image其他算子

gen_image_const( : Image : Type, Width, Height : )
作用:創建灰度值為0的圖像(黑色)

gen_image_proto(Image : ImageCleared : Grayval : )
作用:指定圖像像素為同一灰度值

get_image_size(Image : : : Width, Height)
作用:計算圖像尺寸

get_domain(Image : Domain : : )
作用:得到圖像定義域

crop_domain(Image : ImagePart : : )
作用:裁剪圖像得到新圖像

get_grayval(Image : : Row, Column : Grayval)
作用:獲得圖像像素點的灰度值

set_grayval(Image : : Row, Column, Grayval : )
作用:設置圖像像素點的灰度值

依靠上面這些常用算子,我們可以做個漸變的效果

* 創建灰度值為0的圖像
gen_image_const (Image, 'byte', 100, 100)
* 計算圖像尺寸
get_image_size (Image, Width, Height)
* 指定圖像像素為同一灰度值
gen_image_proto (Image, ImageCleared, 127)
* 得到圖像的定義域
get_domain (Image, Domain)
* 裁剪圖像得到新圖像
crop_domain (Image, ImagePart)
* 獲取某像素點的灰度值
get_grayval (ImagePart, 50, 50, Grayval)
gray_num:=0
* 開始循環
for i := 0 to 51 by 1
    for j := 0 to 51 by 1
        * 設置某像素點的灰度值
        set_grayval (ImagePart, 23+i, 23+j, gray_num)
        gray_num:=gray_num+5
    endfor
    gray_num:=0
endfor

運行結果如下圖
image


HALCON Region區域

很多情況下,我們將圖像處理限制在圖像上某一特定的感興趣區域(ROI)


Region的初步介紹

將Image轉換為區域通常用threshold算子、

threshold(Image : Region : MinGray, MaxGray : )
作用:閾值分割圖像獲得圖像

選擇出來的區域的灰度值g要滿足

\[MinGray\le g \le MaxGray \]

如果圖像是彩色圖像,那么threshold只會返回針對第一通道的閾值分割區域

選擇閾值我們通常會用到灰度直方圖進行選擇,並且可以在灰度直方圖調整閾值時直觀的看到區域變化,調整完之后可以直接插入代碼

threshold(Image : Region : MinGray, MaxGray : )
作用:使用全局閾值分割圖像

image

threshold算子只會返回一個區域,想要通過區域特征篩選區域,就需要將不同區域分離,在HALCON環境下通常用connection算子

connection(Region : ConnectedRegions : : )
作用:計算一個區域中連通的區域

分離后可以通過區域的特征篩選出想要的區域

image

除了用閾值分割得到區域,還可以用區域生長法得到區域
區域生長法通常用regiongrowing算子

regiongrowing(Image : Regions : Row, Column, Tolerance, MinSize : )
作用:使用區域生長法分割圖像獲得區域

image

區域生長分割圖像的思路:在圖像內移動大小為\(Row \times Column\) 的矩形模版,對比圖像與模版中心的灰度值,當兩個灰度值差值小於一定值是認為是同一區域

HALCON可以通過算子獲得指定區域的灰度直方圖,並將獲得的直方圖轉換為區域,通常用到gray_histogen_region_histo算子

gray_histo(Regions, Image : : : AbsoluteHisto, RelativeHisto)
作用:獲得圖像指定區域的灰度直方圖

gen_region_histo( : Region : Histogram, Row, Column, Scale : )
作用:將獲得的灰度直方圖轉換為區域

程序實例如下

read_image (Image, 'fabrik')
dev_close_window ()
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
dev_set_draw ('margin')
dev_set_color ('red')
* 創建平行坐標軸的矩形
gen_rectangle1 (Rectangle, 20, 130, 90, 230)
dev_set_color ('green')
gen_rectangle1 (Rectangle1, 110, 400, 210, 500)
* 獲取指定區域的灰度直方圖
gray_histo (Rectangle, Image, AbsoluteHisto, RelativeHisto)
gray_histo (Rectangle1, Image, AbsoluteHisto1, RelativeHisto1)
dev_set_color ('blue')
* 將創建的灰度直方圖轉換為區域
gen_region_histo (Region, AbsoluteHisto, 255, 255, 1)
dev_set_color ('orange red')
gen_region_histo (Region1, AbsoluteHisto1, 255, 255, 1)

運行結果如下圖
image

Region特征分為三個部分

  1. 基礎特征:面積、中心、寬高、左上和右下坐標、長短半軸等
  2. 形狀特征:外接圓半徑、內接圓半徑、圓度、緊密度、矩形度、凸性等
  3. 幾何矩特征:二階距、三階矩、主慣性軸等

區域特征

特征名 描述
area 面積
row 中心點行坐標
column 中心點列坐標
width 區域寬度
height 區域高度
row1 左上角行坐標
column1 左上角列坐標
row2 右下角行坐標
column2 右下角列坐標
circularity 圓度
compactness 緊密度
contlength 輪廓線總長度
convexity 凸性
rectangularity 矩形度
ra 等效橢圓長半軸
rb 等效橢圓短半軸
phi 等效橢圓方向
outer_radius 最小外接圓半徑
inner_radius 最大內接圓半徑
connect_num 連通數
holes_num 區域內洞數

根據特征篩選區域需要用到的算子是select_shape

select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )
作用:選取指定形狀特征的區域

區域轉換用到的算子是shape_trans

shape_trans(Region : RegionTrans : Type : )
作用:將區域轉換為其他規則形狀
Type為轉換的類型,選項如下:

  1. convex:凸區域
  2. ellipse:與輸入區域有相同矩的橢圓區域
  3. outer_circle:最小外接圓
  4. inner_circle:最大內接圓
  5. rectangle1:平行於坐標軸的最小外接矩形
  6. rectangle2:任意方向最小外接矩形
  7. inner_rectangle1:平行於坐標軸的最大內接矩形
  8. inner_rectangle2:任意方向最大內接矩形

區域運算常用算子如下:

union1(Region : RegionUnion : : )
作用:返回所有輸入區域的並集

union2(Region1, Region2 : RegionUnion : : )
作用:把兩個區域合並成一個區域

difference(Region, Sub : RegionDifference : : )
作用:計算兩個區域的差集

complement(Region : RegionComplement : : )
作用:計算區域的補集

區域運算例程如下

read_image (Image, 'largebw1.tif')
* 閾值分割
threshold (Image, Region, 200, 255)
* 計算區域連通的部分
connection (Region, ConnectedRegions)
* 按特征選取區域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 500000, 6000000)
* 聯通有聯通性質的區域
union1 (SelectedRegions, RegionUnion)
* 合並兩個區域
union2 (RegionUnion, Region, RegionUnion1)
* 計算兩個區域的差
dev_set_color ('yellow')
difference (Region, RegionUnion, RegionDifference)
* 計算區域間的補集
dev_set_color ('black')
complement (RegionDifference, RegionComplement)

運行結果如下:

image


Region的點與線

在窗口上畫線使用的是disp_line算子

disp_line( : : WindowHandle, Row1, Column1, Row2, Column2 : )
作用:在窗口畫線

disp_有關的算子不能適應窗口的放大和縮小操作,放大或縮小時會消失

可以用gen_region_line創建線形狀的區域

gen_region_line( : RegionLines : BeginRow, BeginCol, EndRow, EndCol : )
作用:根據兩個像素坐標生成線

獲取點和線的坐標可以用get_region_points算子

get_region_points(Region : : : Rows, Columns)
作用:獲得區域的像素點坐標

判斷區域是否相交可以用intersection

intersection(Region1, Region2 : RegionIntersection : : )
作用:獲得兩區域的交集

區域方向有關的算子:

line_orientation( : : RowBegin, ColBegin, RowEnd, ColEnd : Phi)
作用:計算直線方向

orientation_region(Regions : : : Phi)
作用:計算區域方向(弧度值)

angle_ll( : : RowA1, ColumnA1, RowA2, ColumnA2, RowB1, ColumnB1, RowB2, ColumnB2 : Angle)
作用:計算兩直線夾角

line_position( : : RowBegin, ColBegin, RowEnd, ColEnd : RowCenter, ColCenter, Length, Phi)
作用:計算線段的中心、長度、方向

區域方向的例程運行結果如下圖所示

image

image

區域距離常用算子:

distance_pp( : : Row1, Column1, Row2, Column2 : Distance)
作用:計算點到點距離

distance_pl( : : Row, Column, Row1, Column1, Row2, Column2 : Distance)
作用:計算點到線距離

distance_ps( : : Row, Column, Row1, Column1, Row2, Column2 : DistanceMin, DistanceMax)
作用:計算點到線段距離

distance_rr_min(Regions1, Regions2 : : : MinDistance, Row1, Column1, Row2, Column2)
作用:計算區域間最近距離和對應的最近點

distance_lr(Region : : Row1, Column1, Row2, Column2 : DistanceMin, DistanceMax)
作用:計算線到區域最近距離和最遠距離

distance_sr(Region : : Row1, Column1, Row2, Column2 : DistanceMin, DistanceMax)
作用:計算線段到區域的最近距離和最遠距離

區域距離示例程序如下

dev_close_window ()
dev_open_window (0, 0, 300, 300, 'white', WindowHandle)
dev_set_color ('black')
* 生成點區域
gen_region_points (Region, 100, 100)
* 獲得點區域的坐標
get_region_points (Region, Rows, Columns)
* 畫線
disp_line (WindowHandle, Rows, Columns, 64, 64)
* 生成直線區域
gen_region_line (RegionLines, 100, 50, 150, 250)
gen_region_line (RegionLines3, 45, 150, 125, 225)
* 獲得直線區域的坐標
get_region_points (RegionLines, Rows2, Columns2)
gen_region_line (RegionLines1, Rows, Columns, 150, 130)
* 求兩直線區域的交點
intersection (RegionLines, RegionLines1, RegionIntersection)
* 獲得交點坐標
get_region_points (RegionIntersection, Rows1, Columns1)
* 獲得直線區域的方向
line_orientation (Rows, Columns, Rows1, Columns1, Phi)
gen_region_line (RegionLines2, Rows, Columns, Rows1, Columns1)
* 獲得直線區域的方向
orientation_region (RegionLines2, Phi1)
* 計算線段的中心、長度、方向
line_position (Rows, Columns, Rows1, Columns1, RowCenter, ColCenter, Length, Phi2)
* 計算點到點的距離
distance_pp (Rows, Columns, Rows1, Columns1, Distance)
* 計算點到線的距離
distance_pl (200, 200, Rows, Columns, Rows1, Columns1, Distance1)
* 計算點到線段的距離
distance_ps (200, 200, Rows, Columns, Rows1, Columns1, DistanceMin, DistanceMax)
* 計算Region到Region的最短距離和對應的最近點
distance_rr_min (RegionLines2, RegionLines3, MinDistance, Row1, Column1, Row2, Column2)
distance_lr (RegionLines2, 45, 150, 125, 225, DistanceMin1, DistanceMax1)
distance_sr (RegionLines2, 45, 150, 125, 225, DistanceMin2, DistanceMax2)

運行結果如下圖

image

生成形狀規則區域常用算子如下

gen_circle( : Circle : Row, Column, Radius : )
作用:生成圓形區域

gen_ellipse( : Ellipse : Row, Column, Phi, Radius1, Radius2 : )
作用:生成橢圓區域

gen_rectangle1( : Rectangle : Row1, Column1, Row2, Column2 : )
作用:生成平行於坐標軸的矩形區域

gen_rectangle2( : Rectangle : Row, Column, Phi, Length1, Length2 : )
作用:生成任意方向的矩形區域

gen_region_polygon( : Region : Rows, Columns : )
作用:將多邊形轉換為區域

規則形狀區域程序運行效果如下圖

image

image


Region的行程

區域行程有關算子如下

gen_region_runs( : Region : Row, ColumnBegin, ColumnEnd : )
作用:根據同行坐標值生成同行行程

get_region_runs(Region : : : Row, ColumnBegin, ColumnEnd)
作用:獲得區域的行程坐標

runlength_features(Regions : : : NumRuns, KFactor, LFactor, MeanLength, Bytes)
作用:統計區域行程的特征

eliminate_runs(Region : RegionClipped : ElimShorter, ElimLonger : )
作用:消除長度小於ElimShorter和大於ElimLonger的行程

區域行程程序如下

* 根據同行坐標生成行程區域
gen_region_runs (Region, 100, 50, 200)
* 獲得行程區域坐標
get_region_runs (Region, Row, ColumnBegin, ColumnEnd)
* 統計區域行程特征
runlength_features (Region, NumRuns, KFactor, LFactor, MeanLength, Bytes)
dev_clear_window ()
* 畫圓
gen_circle (Circle, 200, 200, 100.5)
set_system ('neighborhood', 8)
dev_set_color ('green')
* 消除制定長度的行程
eliminate_runs (Circle, RegionClipped, 100, 205)
dev_display (RegionClipped)

程序運行結果如下圖

image


Region的區域特征

  • 1.1 區域的面積
    區域面積等於區域包含像素點個數

  • 1.2 區域的中心
    區域的中心坐標是計算區域內所有像素點坐標的平均值

可以用area_center求取區域的面積和中心坐標

area_center(Regions : : : Area, Row, Column)
作用:得到區域的面積和中心坐標

  • 2 區域矩特征

矩特征主要表征圖像區域的幾何特征,由於其具有旋轉、平移、尺度等不變特征,又稱不變矩

\(p+q\)階特征矩\(m_{p,q}\)的公式為

\[m_{p,q}=\sum_{(r,c) \in R} {r^p c^q} \]

  • 3 區域等效橢圓特征

HALCON求等效橢圓參數

elliptic_axis(Regions : : : Ra, Rb, Phi)
作用:計算等效橢圓參數

區域等效橢圓示例

dev_close_window ()
read_image (Image, 'fabrik')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
dev_set_color ('orange')
dev_set_draw ('fill')
regiongrowing (Image, Regions, 1, 1, 3, 400)
select_shape (Regions, SelectedRegions, ['area','area'], 'or', [20195.3,30039.1], [21104.2,33242.2])
union1 (SelectedRegions, RegionUnion)
dev_set_color ('red')
dev_display (RegionUnion)
* 獲取區域等效橢圓參數
elliptic_axis (RegionUnion, Ra, Rb, Phi)
area_center (RegionUnion, Area, Row, Column)
dev_set_draw ('margin')
dev_set_color ('white')
dev_set_line_width (5)
* 畫橢圓
disp_ellipse (WindowHandle, Row, Column, Phi, Ra, Rb)

程序運行結果如下圖

image

  • 4 區域凸性特征

區域內任意兩點進行連線,連線上的所有點都在區域內就稱這個區域為凸集,凸包為區域內所有點構成的最小凸集

關於凸性,HALCON中常用的算子如下

convexity(Regions : : : Convexity)
作用:計算區域的凸性

smallest_circle(Regions : : : Row, Column, Radius)
作用:計算最小外接圓參數

smallest_rectangle1(Regions : : : Row1, Column1, Row2, Column2)
作用:計算平行坐標軸的最小外接矩形參數

smallest_rectangle2(Regions : : : Row, Column, Phi, Length1, Length2)
作用:計算區域任意方向的最小外接矩形參數

區域凸性程序運行結果如下圖

image

  • 5 區域輪廓長度特征

輪廓長度是跟蹤區域邊界獲得輪廓,將邊界上的所有點連接在一起,相鄰兩個輪廓點距離為1,對角線距離為\(\sqrt {2}\)

使用contlength算子可以計算區域輪廓長度

contlength(Regions : : : ContLength)
作用:計算區域長度

  • 6 區域圓度特征
  1. circularity算子計算區域圓度

circularity是計算區域的面積和外接圓的面積之比,其比值越接近1,則形狀越接近圓

circularity(Regions : : : Circularity)
作用:計算區域的圓度

  1. roundness算子計算區域圓度

roundness是計算區域邊界點到區域中心點距離的偏差,區域所有邊界點到中心的距離越接近,圓度值越大

roundness(Regions : : : Distance, Sigma, Roundness, Sides)
作用:計算區域的圓度

  • 7 區域矩形度特征

矩形度為區域面積除以與本區域有相同一階矩和二階距的矩形的面積,得到的值越接近1,區域就越接近矩形,可以用rectangularity

rectangularity(Regions : : : Rectangularity)
作用:計算區域的矩形度

  • 8 區域緊密度特征

區域的緊密度公式為

\[C=\frac {L^2}{4F\pi} \]

有時緊密度也稱為粗糙度,圓的邊界是絕對光滑的,故圓的緊密度為1,其他圖形緊密度大於1,HALCON可以用compactness算子計算區域緊密度

compactness(Regions : : : Compactness)
作用:計算區域的緊密度

  • 9 區域離心率特征

離心率是通過等效橢圓得到的,可以反映區域的細長度,值越大區域越細長,可以用eccentricity計算區域離心率

eccentricity(Regions : : : Anisometry, Bulkiness, StructureFactor)
作用:計算區域的離心率

區域特征程序如下

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'white', WindowHandle)
* 生成矩形區域
gen_rectangle1 (Rectangle, 30, 20, 200, 300)
* 生成圓形區域
gen_circle (Circle, 300, 300, 50)
* 矩形區域凸性
convexity (Rectangle, Convexity)
* 圓形區域凸性
convexity (Circle, Convexity1)
* 矩形區域圓度
circularity (Rectangle, Circularity)
* 圓形區域圓度
circularity (Circle, Circularity1)
* 矩形區域矩形度
rectangularity (Rectangle, Rectangularity)
* 圓形區域矩形度
rectangularity (Circle, Rectangularity1)
* 矩形區域緊密度
compactness (Rectangle, Compactness)
* 圓形區域緊密度
compactness (Circle, Compactness1)
* 矩形區域離心率
eccentricity (Rectangle, Anisometry, Bulkiness, StructureFactor)
* 圓形區域離心率
eccentricity (Circle, Anisometry1, Bulkiness1, StructureFactor1)

程序運行結果如下圖

image


HALCON XLD輪廓


XLD的初步介紹

  1. XLD定義

XLD在HALCON中代表亞像素邊緣和多邊形,利用XLD可以獲得亞像素精度的數據
XLD輪廓用浮點數表示XLD各點的行、列坐標

  1. Image轉換為XLD

提取XLD輪廓用threshold_sub_pixedges_sub_pix

threshold_sub_pix(Image : Border : Threshold : )
作用:從具有像素精度的圖像提取得到XLD輪廓

edges_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
作用:使用'deriche1'、'lanser1'、'deriche2'、'lanser2'、'shen'、'mshen'、'canny', 'sobel'、'sobel_fast'等濾波器提取圖像得到亞像素邊緣

  1. XLD的特征

包括基礎特征形狀特征雲點特征幾何矩特征
基礎特征:XLD面積、中心、寬高、左上角與右下角坐標
形狀特征:圓度、緊密度、長度、矩形度、凸性、偏心率等
雲點特征:雲點面積、面積、等效橢圓半軸等
幾何矩特征:二階距等

  1. 選取特定特征的XLD輪廓

常用算子有select_shape_xldselect_contours_xld

select_shape_xld(XLD : SelectedXLD : Features, Operation, Min, Max : )
作用:選擇特定形狀特征要求的XLD輪廓或多邊形

select_contours_xld(Contours : SelectedContours : Feature, Min1, Max1, Min2, Max2 : )
作用:選擇多種特征要求的XLD輪廓

選擇特定XLD輪廓示例程序如下

read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-12.0/examples/images/rings/mixed_03.png')
* 從具有像素精度的圖像提取得到XLD輪廓
threshold_sub_pix (Image, Border, 128)
* 提取像素得到亞像素邊緣
edges_sub_pix (Image, Edges, 'canny', 1, 20, 40)
* 選定特定形狀特征要求的XLD輪廓或多邊形
select_shape_xld (Edges, SelectedXLD, 'area', 'and', 3000, 99999)
* 選擇多種特征要求的XLD輪廓
select_contours_xld (Edges, SelectedContours, 'contour_length', 1, 200, -0.5, 0.5)

程序運行結果如下圖

image


XLD的數據結構分析

區域或多邊形轉換為亞像素輪廓的算子如下

gen_contour_region_xld(Regions : Contours : Mode : )
作用:區域Region轉換為XLD輪廓

Mode有邊界方式和中心方式

image

邊界和孔洞是以區域的邊界點以及區域內的孔洞邊界為邊緣點構成XLD,在由區域生成XLD時,多數是以像素邊界或中心作為邊界生成XLD,這是XLD的精度是像素級的,這種XLD區域不用於精確計算,根據圖像獲得的XLD才是亞像素級的

得到已知XLD輪廓的坐標點可以用get_contour_xld

get_contour_xld(Contour : : : Row, Col)
作用:獲得XLD的坐標點

gen_contour_polygon_xld( : Contour : Row, Col : )
作用:由多邊形坐標點生成XLD

gen_polygons_xld(Contours : Polygons : Type, Alpha : )
作用:多邊形逼近輪廓生成XLD

gen_ellipse_contour_xld( : ContEllipse : Row, Column, Phi, Radius1, Radius2, StartPhi, EndPhi, PointOrder, Resolution : )
作用:生成橢圓XLD

gen_circle_contour_xld( : ContCircle : Row, Column, Radius, StartPhi, EndPhi, PointOrder, Resolution : )
作用:生成圓(圓弧)XLD

區域或多邊形轉換為XLD程序運行結果如下圖

image

XLD輪廓附加屬性有關算子如下

query_contour_attribs_xld(Contour : : : Attribs)
作用:查詢XLD包含哪些屬性名稱

get_contour_attrib_xld(Contour : : Name : Attrib)
作用:計算XLD包含屬性的值

XLD輪廓附加屬性示例程序如下

dev_close_window ()
read_image (Image, 'screw_thread.png')
dev_open_window (0, 0, 512, 512, 'white', WindowHandle)
dev_display (Image)
* 閾值分割得到XLD輪廓
threshold_sub_pix (Image, Border, 128)
* 亞像素邊緣提取
edges_sub_pix (Image, Edges, 'canny', 1, 20, 40)
threshold (Image, Region, 0, 100)
select_shape_xld (Edges, SelectedXLD, 'area', 'and', 20000, 99999)
* 填充區域
fill_up (Region, RegionFillUp)
* 根據區域生成XLD輪廓,選擇邊界方式
gen_contour_region_xld (RegionFillUp, Contours, 'border')
area_center_xld (Contours, Area, Row, Column, PointOrder)
* 選擇指定特征要求的XLD輪廓
select_shape_xld (Contours, SelectedXLD1, 'area', 'and', 150, 999999)
* 獲取XLD輪廓坐標
get_contour_xld (SelectedXLD1, Row1, Col)
* 生成由一個點構成的XLD
gen_contour_polygon_xld (Contour, 150, 450)
* 生成XLD構成的直線
gen_contour_polygon_xld (Contour1, [150,300], [400,500])
query_contour_attribs_xld (SelectedXLD, Attribs)
get_contour_attrib_xld (SelectedXLD, 'angle', Attrib)

程序運行結果如下圖

image


XLD的特征分析

XLD可以看作點雲的情況有:

  1. XLD自相交

  2. XLD的結束點和開始點之間的區域不能構成封閉的XLD

可以用兩個算子觀察XLD點和XLD點雲的區別

area_center_xld(XLD : : : Area, Row, Column, PointOrder)
作用:求XLD面積中心及點的排列次序

area_center_points_xld(XLD : : : Area, Row, Column)
作用:求XLD點雲的面積和中心

生成封閉XLD和不封閉XLD的輪廓程序如下

* 封閉多邊形
gen_contour_polygon_xld (Contour, [10,100,100,50,10], [10,10,100,100,10])
area_center_xld (Contour, Area, Row, Column, PointOrder)
area_center_points_xld (Contour, Area1, Row1, Column1)

* 不封閉多邊形
gen_contour_polygon_xld (Contour1, [10,100,100,50], [110,110,210,210])
area_center_xld (Contour1, Area2, Row2, Column2, PointOrder1)
area_center_points_xld (Contour1, Area3, Row3, Column3)

程序運行結果如下圖

image

XLD點雲面積為4,因為生成XLD的關鍵點有4個
封閉XLD面積就是所圍區域的面積

XLD其他特征有關算子如下

test_self_intersection_xld(XLD : : CloseXLD : DoesIntersect)
作用:判斷XLD是否自相交

這個還是比較重要的,建議還是多檢查

XLD自相交的情況:

  1. 開始點是交叉點
  2. 結束點是交叉點
  3. 開始點和結束點都是交叉點
  4. 除開始點和結束點外其他都是交叉點

close_contours_xld(Contours : ClosedContours : : )
作用:閉合XLD輪廓

elliptic_axis_xld(XLD : : : Ra, Rb, Phi)
作用:獲得XLD的等效橢圓參數

diameter_xld(XLD : : : Row1, Column1, Row2, Column2, Diameter)
作用:計算XLD上距離最遠的兩個點和最遠距離

smallest_rectangle1_xld(XLD : : : Row1, Column1, Row2, Column2)
作用:獲得平行於坐標軸的最小外接矩形的左上角和右下角坐標

smallest_rectangle2_xld(XLD : : : Row, Column, Phi, Length1, Length2)
作用:獲得任意角度的最小外接矩形中心坐標

moments_xld(XLD : : : M11, M20, M02)
作用:獲得XLD的封閉區域的二階距

XLD特征示例程序如下

* 生成區域圓
gen_circle (Circle, 50, 50, 50)
* 生成橢圓XLD
gen_ellipse_contour_xld (ContEllipse, 50, 150, 0, 50, 30, 0, rad(360), 'positive', 1.5)
* 生成圓XLD
gen_circle_contour_xld (ContCircle, 50, 250, 50, 0, 6.28318, 'positive', 1)
* 根據圓弧生成多邊形,多邊形的邊到圓的最大距離為10
gen_polygons_xld (ContCircle, Polygons, 'ramer', 10)
* 檢測圓XLD是否自相交
test_self_intersection_xld (ContCircle, 'true', DoesIntersect)
* 獲得XLD中心、面積與點排序
area_center_xld (ContCircle, Area, Row, Column, PointOrder)
* 獲得圓區域的中心及面積
area_center (Circle, Area1, Row1, Column1)
* 根據點生成三角形XLD
gen_contour_polygon_xld (Contour, [200,400,400,200], [250,120,430,250])
* 獲取三角形XLD中心、面積與點排序
area_center_xld (Contour, Area2, Row2, Column2, PointOrder1)
test_self_intersection_xld (Contour, 'true', DoesIntersect1)
* XLD作為點雲求中心面積
area_center_points_xld (Contour, Area3, Row3, Column3)
* 獲得已生成的多邊形XLD各點長度與角度
get_polygon_xld (Polygons, Row4, Col, Length, Phi)
* 獲得橢圓XLD的等效橢圓參數
elliptic_axis_xld (Contour, Ra, Rb, Phi1)
* 獲得橢圓XLD的圓度
circularity_xld (Contour, Circularity)
* 獲得橢圓XLD的凸性
convexity_xld (Contour, Convexity)
* 獲得橢圓XLD的緊密度
compactness_xld (Contour, Compactness)
* 計算XLD上距離最遠的兩個點和最遠距離
diameter_xld (Contour, Row11, Column11, Row21, Column21, Diameter)
* 獲得平行於坐標軸的最小外接矩形的左上和右下角坐標
smallest_rectangle1_xld (Contour, Row12, Column12, Row22, Column22)
* 獲得任意角度的最小外接矩形的中心坐標
smallest_rectangle2_xld (Contour, Row5, Column4, Phi2, Length1, Length2)
* 獲得XLD封閉區域二階距
moments_xld (Contour, M11, M20, M02)

程序運行結果如下圖

image


XLD的回歸參數

這里我沒看懂,有書的朋友們可以自己研究哈,我就只把算子和例程放出來就好了

regress_contours_xld(Contours : RegressContours : Mode, Iterations : )
作用:計算XLD輪廓的回歸直線

get_regress_params_xld(Contours : : : Length, Nx, Ny, Dist, Fpx, Fpy, Lpx, Lpy, Mean, Deviation)
作用:獲得輪廓XLD的參數

例程如下

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'white', WindowHandle)
gen_circle_contour_xld (ContCircle, 290, 260, 100, 0, 1, 'positive', 1)
* 獲得XLD的全局屬性的名字
query_contour_global_attribs_xld (ContCircle, Attribs)
* 計算XLD輪廓的回歸直線
regress_contours_xld (ContCircle, RegressContours, 'no', 1)
query_contour_global_attribs_xld (RegressContours, Attribs1)
get_contour_global_attrib_xld (RegressContours, 'regr_norm_row', Attrib)
* 獲得輪廓XLD的參數
get_regress_params_xld (RegressContours, Length, Nx, Ny, Dist, Fpx, Fpy, Lpx, Lpy, Mean, Deviation)

運行結果如下圖

image


HALCON Tuple數組

數組還是很重要的,三個程序如下

* 定義空數組
Tuple:=[]
* 指定數據定義數組
Tuple:=[1,2,3,4,5,6,7,8,9,10]
Tuple1:=[1,5,8,'giao']
Tuple2:=[0x04,010,9,'hello']
Tuple3:=gen_tuple_const(20,1) //創建一個有20個元素,每個元素值為1的數組
* 數組更改數值
Tuple[3]:=123
Tuple[5]:='蕪湖'
* 數組取模
Num:=|Tuple|
* 合並數組
Union_Tuple:=[Tuple,Tuple1]
* 生成1~100內的數
Num1:=[1:100] //間距為1
Num2:=[1:3:100] //間距為3
* 提取數組內的數
Str:=Union_Tuple[5]
* 根據已知數組生成子數組
Sun_Tuple:=Union_Tuple[2:6]
Tuple:=[1,4,3]
Tuple1:=[1,2,5]
Tuple2:=[8,6,6]
* 加減乘除(前提是運行的數組元素個數要相同)
tuple_add (Tuple, Tuple1, Tuple2)
tuple_sub (Tuple, Tuple2, Tuple2)
tuple_mult (Tuple, Tuple1, Tuple2)
tuple_div (Tuple, Tuple1, Tuple2)
* 取余
tuple_mod (Tuple, Tuple1, Tuple2)
* 取反
tuple_neg (Tuple1, Neg)
* 數組取整
Neg:=[1,2,9.5]
tuple_int (Neg, Int)
tuple_round (Neg, Round)
* 數組轉實數
tuple_real (Round, Real)

* 按位左移
tuple_lsh (Tuple, Tuple1, Tuple2)
* 按位右移
tuple_rsh (Tuple, Tuple1, Tuple2)
* 按位運算
tuple_band (Tuple, Tuple1, Tuple2) //按位與
tuple_bor (Tuple, Tuple1, Tuple2) //按位或
tuple_bxor (Tuple, Tuple1, Tuple2) //按位異或
tuple_bnot (11, Neg) //按位取反
tuple_bnot ([2,55],Neg)
Tuple:='hello'+'giao'
Tuple:=3.1+(2+'giao')

Tuple1:='giao'
Tuple2:='220'+Tuple1{1:3}+'蕪湖'

* 取字符串長度
Length:=strlen(Tuple2)
* 選擇字符串位置
Str:=strstr(Tuple2,Tuple1) //返回-1 代表沒找到
Tuple2:='220giao蕪湖'
Str:=strstr(Tuple2,Tuple1) //找到了,返回字符串的首字符位置
* 保存成長度為10的字符,字符左對齊,三位小數
Index:=29.99999$'.3f'
* 保存成小數點后七位的字符
Index:=123.456487687321$'.7f'
* 整數轉換為小寫十六進制
Index:=200$'x'
* 十六進制數轉換為整數字符串
Index:=0x7f$'0.5d'

* 弧度轉角度
phi:=deg(3.1415926)
* 角度轉弧度
phi:=rad(120)
* 正弦、余弦、正切
val:=sin(120)
val:=cos(30)
val:=tan(45)

Tuple:=[1,2.5,10]
Tuple1:=[4,20,12]
* 數組內最小值、最大值
val:=min(Tuple)
val:=max(Tuple)
* 兩數組對應位置最小值
Tuple2:=min2(Tuple,Tuple1)
* 兩數組對應位置最大值
Tuple2:=max2(Tuple,Tuple1)

* 數組元素求和
val_sum:=sum(Tuple)
val_mean:=mean(Tuple)
val_abs:=abs(Tuple)

第四章的筆記就到這里啦,如果你一路看到了這里,幫我點個贊吧O(∩_∩)O~,祝大家學習能有所收獲!😀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM