我在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其他算子

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

运行结果如下图


HALCON Region区域

很多情况下,我们将图像处理限制在图像上某一特定的感兴趣区域(ROI)


Region的初步介绍

将Image转换为区域通常用threshold算子、

threshold(Image : Region : MinGray, MaxGray : )

作用:阈值分割图像获得图像

选择出来的区域的灰度值g要满足

\[MinGray\le g \le MaxGray
\]

如果图像是彩色图像,那么threshold只会返回针对第一通道的阈值分割区域

选择阈值我们通常会用到灰度直方图进行选择,并且可以在灰度直方图调整阈值时直观的看到区域变化,调整完之后可以直接插入代码

threshold(Image : Region : MinGray, MaxGray : )

作用:使用全局阈值分割图像

threshold算子只会返回一个区域,想要通过区域特征筛选区域,就需要将不同区域分离,在HALCON环境下通常用connection算子

connection(Region : ConnectedRegions : : )

作用:计算一个区域中连通的区域

分离后可以通过区域的特征筛选出想要的区域

除了用阈值分割得到区域,还可以用区域生长法得到区域

区域生长法通常用regiongrowing算子

regiongrowing(Image : Regions : Row, Column, Tolerance, MinSize : )

作用:使用区域生长法分割图像获得区域

区域生长分割图像的思路:在图像内移动大小为\(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)

运行结果如下图

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)

运行结果如下:


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)

作用:计算线段的中心、长度、方向

区域方向的例程运行结果如下图所示

区域距离常用算子:

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)

运行结果如下图

生成形状规则区域常用算子如下

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 : )

作用:将多边形转换为区域

规则形状区域程序运行效果如下图


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)

程序运行结果如下图


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)

程序运行结果如下图

  • 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)

作用:计算区域任意方向的最小外接矩形参数

区域凸性程序运行结果如下图

  • 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)

程序运行结果如下图


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)

程序运行结果如下图


XLD的数据结构分析

区域或多边形转换为亚像素轮廓的算子如下

gen_contour_region_xld(Regions : Contours : Mode : )

作用:区域Region转换为XLD轮廓

Mode有边界方式和中心方式

边界和孔洞是以区域的边界点以及区域内的孔洞边界为边缘点构成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程序运行结果如下图

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)

程序运行结果如下图


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)

程序运行结果如下图

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)

程序运行结果如下图


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)

运行结果如下图


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~,祝大家学习能有所收获!

《HALCON数字图像处理》第四章笔记的更多相关文章

  1. 数字图像处理 第四章 P157 小错误

    问题 我认为P157中部的卷积公式是错的,f(x)h(x-m)应当写为f(m)h(x-m) 解决方法 为了证明,我就用我蹩脚的python实现一下图4.28左列 源代码如下 import numpy ...

  2. #Python编程从入门到实践#第四章笔记

    #Python编程从入门到实践#第四章笔记   操作列表 ​​​1.遍历列表 使用for循环,遍历values列表 for value in values: print(value) 2.数字列表 使 ...

  3. 《APUE》第四章笔记(1)

    1.引言 本章介绍文件系统的特征和文件的性质.从stat函数开始,逐个说明stat结构的每一个成员以了解文件的所有属性.在此过程中,还将会说明修改这些属性的各个函数,并更详细地查看UNIX文件系统的结 ...

  4. 《HALCON数字图像处理》第一、二章笔记

    目录 第一章 绪论 1.1 图像和图像处理 1.1.1 图像 1.1.2 数字图像 1.1.3 图像处理及其发展过程 1.2 数字图像处理的步骤和方法 1.3 数字图像处理系统的硬件组成 1.4 数字 ...

  5. 数字图像处理(MATLAB版)学习笔记(2)——第2章 灰度变换与空间滤波

    0.小叙闲言 1.本章整体结构 2.书中例子 例2.1 主要是使用函数imadjust,来熟悉一下灰度处理,体验一把 >> imread('myimage.jpg'); >> ...

  6. 数字图像处理(MATLAB版)学习笔记(1)——第1章 绪言

    0.下定决心 当当入手数字图像处理一本,从此开此正式跨入数字图像处理大门.以前虽然多多少少接触过这些东西,也做过一些相关的事情,但感觉都不够系统,也不够专业,从今天开始,一步一步地学习下去,相信会有成 ...

  7. 《APUE》第四章笔记(2)

    下面介绍对stat结构的各个成员的操作函数. 先贴个stat结构的图: access函数: #include <unistd.h> int access(const char *pathn ...

  8. C#语言和SQL Server第十三 十四章笔记

    十三章  使用ADO.NET访问数据库 十四章使用ADO.NET查询和操作数据库 十三章:                                                       ...

  9. linux第四章笔记

    第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间.进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统. 最大限度利用处理器时间的原则:只要有可以执行 ...

随机推荐

  1. CentOS系统Tomcat 8.5或9部署SSL证书

    本文档介绍了CentOS系统下Tomcat 8.5或9部署SSL证书的操作说明. 环境准备 操作系统:CentOS 7.6 64位 Web服务器:Tomcat 8.5或9 前提条件 已从阿里云SSL证 ...

  2. 【Python打包成exe方法】——已解决导入第三方包无法打包的问题

    ​ 前言 在我们写代码的过程中,我们开发的脚本一般都会用到一些第三方包,可能别人也需要用到我们的脚本,如果我们将我们的xx.py文件发给他,他是不能直接用的,他还需要安装python解释器,甚至还要安 ...

  3. ASP.NET Core WebApi返回结果统一包装实践

    前言 近期在重新搭建一套基于ASP.NET Core WebAPI的框架,这其中确实带来了不少的收获,毕竟当你想搭建一套框架的时候,你总会不自觉的去想,如何让这套框架变得更完善一点更好用一点.其中在关 ...

  4. 在网站copy时自带的版权小尾巴以及“复制代码“,可以怎么实现

    前言 每天网上的博客各个领域都会涌现新文章,有时候看到感兴趣的知识就想把某段文字 copy下来 摘录下来,等有时间后慢慢品味 在部分网站上,如果只是复制少量文字,并没有什么不同.但是当我们复制的文字多 ...

  5. golang-grpc

    目录 1. 什么是grpc和protobuf 1.1 grpc 1.2 protobuf 2.go下grpc 2.1官网下载protobuf工具 2.2 下载go的依赖包 2.3 编写proto文件 ...

  6. Fastjsonfan反序列链学习前置知识

    Fastjson前置知识 Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象. Fastjson 可以操作任何 ...

  7. Dom基础(一):attribute和properrty的区别

    properrty:修改对象属性不会体现到html结构中,针对DOM节点自带属性(id,className,style) attribute:修改html属性,会改变html结构,大多可以添加自定义属 ...

  8. 基于Ansible实现Apache Doris快速部署运维指南

    Doris Ansible 使用指南 Apache Doris 介绍 Apache Doris是一个现代化的MPP分析型数据库产品.仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析.Apac ...

  9. IDEA SpringBoot-Mybatis-plus 实现增删改查(CRUD)

    上一篇: IDEA SpringBoot-Mybatis实现增删改查(CRUD) 下一篇:Intellij IDEA 高效使用教程 (插件,实用技巧) 最好用的idea插件大全 一.前言 Mybati ...

  10. Electron结合React和TypeScript进行开发

    目录 结合React+TypeScript进行Electron开发 1. electron基本简介 为什么选择electron? 2. 快速上手 2.1 安装React(template为ts) 2. ...