文章目录
- 9.1 区域形状特征
- 9.1.1 区域的面积和中心点
- 9.1.2 封闭区域(孔洞)的面积
- 9.1.3 根据特征值选择区域
- 9.1.4 根据特征值创建区域
- 9.2 基于灰度值的特征
- 9.2.1 区域的灰度特征值
- 9.2.2 区域的最大、最小灰度值
- 9.2.3 灰度的平均值和偏差
- 9.2.4 灰度区域的面积和中心
- 9.2.5 根据灰度特征值选择区域
- 9.3 基于图像纹理的特征
- 9.3.1 灰度共生矩阵
- 9.3.2 创建灰度共生矩阵
- 9.3.3 用共生矩阵计算灰度值特征
- 9.3.4 计算共生矩阵并导出其灰度值特征
- 9.3.5 提取图像的纹理特征
9.1 区域形状特征
在场景中选择物体的特征是图像测量或者识别的重要基础。
9.1.1 区域的面积和中心点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36dev_close_window () *读取图片 read_image(Image, 'data/holes') *设置窗口属性,为了获取窗口句柄,供后面显示文字用 get_image_size (Image, Width, Height) *创建新窗口 dev_open_window (0, 0, Width, Height, 'black', WindowID) *将图像转化为单通道灰度图 rgb1_to_gray (Image, GrayImage) *创建矩形选区,选择感兴趣部分 gen_rectangle1 (Rectangle, 180, 83, 371, 522) reduce_domain (GrayImage, Rectangle, ROI) *阈值处理,提取图中深色部分,也就是文字部分,这里阈值设置为50,基本可以取出所有黑色文字 threshold ( ROI, Region, 0, 80) *gen_image_proto (ImageReduced, ImageCleared, 0) *dev_display (Region) *提取中的整个区域中将不相连的部分分割成独立的区域 connection (Region, ConnectedRegions) *获取不相连的区域的数量 count_obj (ConnectedRegions, Num) *计算所有不相连区域的面积和中心点坐标。Area表示面积, Row和 Column分别表示中心点坐标 area_center (ConnectedRegions, Area, Row, Column) *打印各区域的面积 for i := 1 to Num by 1 dev_set_color ('red') select_obj (ConnectedRegions, ObjectSelected, i) *设定了输出文字的起始坐标点 set_tposition (WindowID, Row[i - 1]+40, Column[i - 1]) *设置打印文字的颜色 dev_set_color ('blue') *设置字体 * set_font (WindowID, '-System-32-*-*-0-0-0-1-GB2312_CHARSET-') *输出文字内容,即该区域的面积 write_string (WindowID, Area[i-1]) endfor
9.1.2 封闭区域(孔洞)的面积
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15*清空显示窗口 dev_close_window () *读取包含孔洞的图片 read_image (Image, 'data/holes2') *打开新的显示窗口 dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) *将彩色图像转化为灰度图像,这是为了后面的图像二值化 rgb1_to_gray (Image, GrayImage) *进行阈值处理,提取出图中较亮的有封闭区域的(孔洞以外)背景区域 threshold (GrayImage, Region, 50,255) *将背景区域作为area_holes算子的输入,计算所有孔洞的面积 area_holes (Region, Area) *将面积计算结果以字符串形式显示在窗口中 disp_message (WindowHandle, 'Size of holes: ' + Area + ' pixel', 'window', 10, 10, 'black', 'true')
9.1.3 根据特征值选择区域
当我们想要提取Region时,图像处理后,往往存在几个类似的Region,此时,需要根据Region的一些特殊特征,来选择指定的Region。
求Region指定特征值:region_features(Regions : : Features : Value)
根据特征值选择区域:select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31*清空显示窗口 dev_close_window () *读取待检测的图像 read_image (Image, 'data/crossShape') dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) *设置系统绘制的颜色 dev_set_color ('white') *将彩色图像转化为灰度图像,这是为了后面的图像二值化 rgb1_to_gray (Image, GrayImage) *创建矩形选区,选择感兴趣部分 gen_rectangle1 (Rectangle, 100, 127, 325, 490) reduce_domain (GrayImage, Rectangle, ROI) gen_image_proto (ROI, ImageCleared, 0) *进行阈值处理,提取出图中较暗的包含了孔洞的区域 threshold (ROI, Regions, 50, 255) *将其不连通的部分独立分割出来,成为一组区域 connection (Regions, ConnectedRegions) *设置系统绘制的颜色。为了标记选择的区域 dev_set_color ('yellow') *方法一 *将阈值处理的结果区域作为select_shape算子的输入,根据区域的宽度,选择出目标 select_shape (ConnectedRegions, SelectedRegions1, 'area', 'and', 1000, 99999) *方法二 *先计算面积,再选择出面积最大的目标 area_center(ConnectedRegions, Area, Row, Column) select_shape (ConnectedRegions, SelectedRegions2, 'area', 'and', max(Area), 99999) *方法三 select_shape_std (SelectedRegions1, SelectedRegion3, 'max_area', 70) dev_clear_window () dev_display (SelectedRegion3)
9.1.4 根据特征值创建区域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29dev_close_window () *读取图像 read_image (Image, 'data/crossShape') get_image_size (Image, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowID) rgb1_to_gray (Image, GrayImage) *创建矩形选区,选择感兴趣部分 gen_rectangle1 (Rectangle, 100, 127, 325, 490) reduce_domain (GrayImage, Rectangle, ROI) *进行阈值处理,提取出图中较暗的包含了孔洞的区域 threshold (ROI, Regions, 50, 255) *将其不连通的部分独立分割出来,成为一组区域 connection (Regions, ConnectedRegions) select_shape_std (ConnectedRegions, SelectedRegion3, 'max_area', 70) dev_set_draw ('fill') *求出了三个区域的最大内接圆的中心和半径 inner_circle(SelectedRegion3,Row,Column,Radius) *绘制圆形 gen_circle(Circles,Row,Column,Radius) dev_set_window (WindowID) *gen_image_proto (ROI, ImageCleared, 0) *dev_display (SelectedRegion3) *绘制形状的边缘 dev_set_draw ('margin') dev_set_line_width (3) *显示内接圆形 dev_display (Image) dev_display (Circles)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23dev_close_window () read_image (Image, 'data/garlic2') get_image_size (Image, Width, Height) dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle) rgb1_to_gray (Image, GrayImage) *使阈值处理提取出了较暗的区域 threshold (GrayImage, Region, 100, 255) *将非连通区域分割成一组区域的集合 connection (Region, ConnectedRegions) *利用面积特征,将比较大快的区域分割出来 select_shape(ConnectedRegions,selectRegion,'area','and',50000,200000) *求最小外接矩形 smallest_rectangle2 (selectRegion, Row1, Column1, Phi, Length1, Length2) *根据矩形参数创建举行的轮廓 gen_rectangle2_contour_xld (Rectangle1, Row1, Column1, Phi, Length1, Length2) *显示最小外接矩形 dev_set_window (WindowHandle) dev_set_draw ('margin') dev_set_line_width (3) dev_display (Image) dev_display (Rectangle1)
- inner_rectangle1:求一个区域的最大内接矩形
- smallest_rectangle1:求最小外接矩形
(与smallest_rectangle2的区别:smallest_rectangle1求出的矩形永远是与图像的水平坐标轴平行的,不会发生旋转)
9.2 基于灰度值的特征
除了基于形状的特征以外,比较常用的还有基于灰度值的特征,即利用灰度信息表现区域或者图像的特征。
9.2.1 区域的灰度特征值
gray_features :计算指定区域的灰度特征值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39gray_features (Operator) Name gray_features — Calculates gray value features for a set of regions. Signature gray_features(Regions, Image : : Features : Value) Description gray_features has a set of regions (Regions) as input. For each of these regions the features (Features) are calculated and returned in Value. Possble values for Features: 'area' 灰度区域的面积 'row' 中心点的行坐标 'column'中心点的列坐标 'ra' 椭圆的长轴 'rb' 椭圆的短轴 'phi' 等效椭圆角度 'min' 灰度的最小值 'max' 灰度的最大值 'median'灰度的中值 'mean' 灰度的均值 'deviation'灰度的偏差 'plane_deviation' 近似平面的偏差 'anisotropy' Anisotropy (see entropy_gray) 'entropy' Entropy (see entropy_gray) 'fuzzy_entropy' Fuzzy entropie of region (see fuzzy_entropy, with a fuzzy function from Apar=0 to Cpar=255) 'fuzzy_perimeter' Fuzzy perimeter of region (see fuzzy_perimeter, with a fuzzy function from Apar=0 to Cpar=255) 'moments_row' Mixed moments along a row (see moments_gray_plane) 'moments_column' Mixed moments along a column (see moments_gray_plane) 'alpha' Approximating plane, parameter Alpha (see moments_gray_plane) 'beta' Approximating plane, parameter Beta (see moments_gray_plane)
9.2.2 区域的最大、最小灰度值
min_max_gray(Regions,Image::percent:Min,Max,Range)
此算子用于提取 Regions 所在区域图像的最大与最小灰度值,
9.2.3 灰度的平均值和偏差
函数原型:intensity(Regions,Images:::Mean,Deviation)
功能:计算Images中Regions的均值和方差。
参数列表:
第1个参数Regions是输入对象,即被计算区域
第2个参数Images是输入变量,即灰度图像
第3个参数Mean是输出变量,即被测区域的灰度均值
第4个参数Deviation是输出变量,即被测区域的灰度方差
9.2.4 灰度区域的面积和中心
函数原型:
area_center_gray(Regions: Image: : : Area, Row, Column)
函数作用:
计算灰度图像中一个区域的面积和重心
函数原理:
该算子同area_center类似,但是它将图像的灰度值也考虑在内,所以area_center_gray的面积计算的是灰度图像的灰度容量。而它的重心是指灰度值的前两个标准矩。
参数列表:
Regions:被检测的区域
Image:灰度图像
Row:重心的行坐标
Column:重心的列坐标
可能前置项:
threshold, regiongrowing, connection
可替代项:
area_center
9.2.5 根据灰度特征值选择区域
select_gray(Regions, Image : SelectedRegions : Features, Operation, Min, Max : )
函数计算图像Image 的区域Regions内指定属性Features,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26*读取输入图像 read_image (Image, 'data/village') *获取原始图像的宽和高 get_image_size (Image, Width, Height) *创建同尺寸的显示图像的窗口 dev_open_window (0, 0, Width, Height, 'white', WindowID) *将图像转化为灰度图像 rgb1_to_gray (Image, GrayImage) *使用均值滤波对灰度图像进行平滑,以去除细节杂点 median_image (GrayImage, ImageMedian, 'circle', 2, 'mirrored') *进行阈值处理,提取出较亮部分 threshold (ImageMedian, BrightRegion, 180, 255) *使用开运算使各区域分离 opening_circle (BrightRegion, RegionClosing, 6.5) *将不相连通的区域分割开来 connection (RegionClosing, BrightRestConnection) *将面积较大的区域提取出来 select_shape (BrightRestConnection, SelectedRegions1, 'area', 'and', 5000, 99999) *获取这些区域的均值和偏差。由于湖面区域灰度值比较平滑,灰度偏差会比较小 intensity (SelectedRegions1, ImageMedian, Mean, Deviation) *以灰度偏差为条件,选出符合条件的区域 select_gray (SelectedRegions1, ImageMedian, SelectedRegions, 'deviation', 'and', 4, 10) dev_clear_window () dev_display (GrayImage) dev_display (SelectedRegions)
9.3 基于图像纹理的特征
形状特征描述了图像中局部区域的几何属性。
图像的表面纹理也是重要的特征之一。
9.3.1 灰度共生矩阵
参考:灰度共生矩阵的原理及实现(特征提取)-OpenCV
https://blog.csdn.net/qq_37059483/article/details/78292869
9.3.2 创建灰度共生矩阵
9.3.3 用共生矩阵计算灰度值特征
函数原型:
cooc_feature_matrix(CoccMatrix : : : Energy, Correlation, Homogeneity, Contrast)
函数作用:
从共生矩阵中求出灰度特征值
参数列表:
CoocMatrix(in):共生矩阵
Energy(out):灰度能量
Correlation(out):灰度相关性
Homogeneity(out):灰度的局部均匀性(一致性)
Contrast(out):灰度值对比
可能前置项:
gen_cooc_matrix
可替代项:
cooc_feature_image
9.3.4 计算共生矩阵并导出其灰度值特征
cooc_feature_image - 计算共生矩阵并导出其灰度值特征。
cooc_feature_image(Regions, Image : : LdGray, Direction : Energy, Correlation, Homogeneity, Contrast)
cooc_feature_image的调用对应于算子gen_cooc_matrix和cooc_feature_matrix的连续执行。 如果连续评估共生矩阵的几个方向矩阵,则通过gen_cooc_matrix生成矩阵然后调用算子cooc_feature_matrix生成矩阵更为有效。 参数Direction以角度或’mean’方式传输邻域的方向。 在’mean’的情况下,平均值是在所有四个方向上计算的。
9.3.5 提取图像的纹理特征
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43dev_close_window () *读取输入的图片 read_image (Image, 'data/board') *将输入的彩色图像转为黑白图像 rgb1_to_gray (Image, GrayImage) get_image_size (GrayImage, Width, Height) *创建一个与输入图像同样大小的窗口 dev_open_window (0, 0, Width/4, Height/4, 'black', WindowID) *设定画笔宽度 dev_set_line_width (5) *创建两个窗口用于显示参数计算的结果 dev_open_window (0, 512, 320, 320, 'black', WindowID1) dev_open_window (512, 512, 320, 320, 'black', WindowID2) *分别设置两个矩阵,选择不同的两部分区域 gen_rectangle1 (Rectangle1, 200,10, 380, 190) gen_rectangle1 (Rectangle2, 580, 650, 730, 800) *分别对两个矩形求取灰度共生矩阵Matrix1和Matrix2 gen_cooc_matrix (Rectangle1, GrayImage, Matrix1, 6, 0) gen_cooc_matrix (Rectangle2, GrayImage, Matrix2, 6, 0) *分别对Matrix1和Matrix2提取灰度特征参数 cooc_feature_matrix (Matrix1, Energy1, Correlation1, Homogeneity1, Contrast1) cooc_feature_matrix (Matrix2, Energy2, Correlation2, Homogeneity2, Contrast2) *采取另一种方式,直接对矩阵2的图像求灰度特征参数,结果与上面两步计算出的参数是一致的 cooc_feature_image (Rectangle2, GrayImage, 6, 0, Energy3, Correlation3, Homogeneity3, Contrast3) *显示图像窗口和两个矩形的灰度共生矩阵 dev_set_window (WindowID) dev_set_draw ('margin') dev_display (GrayImage) dev_display (Rectangle1) dev_set_color('yellow') dev_display (Rectangle2) dev_set_window (WindowID1) dev_display (Matrix1) *以字符串的形式,分别在两个矩阵的对应窗口上显示灰度特征值的计算结果 String := ['Energy: ','Correlation: ','Homogeneity: ','Contrast: '] dev_set_color('red') disp_message (WindowID1, String$'-14s' + [Energy1,Correlation1,Homogeneity1,Contrast1]$'6.3f', 'window', 12, 12, 'white', 'false') dev_set_window (WindowID2) dev_display (Matrix2) dev_set_color('yellow') String := ['Energy: ','Correlation: ','Homogeneity: ','Contrast: '] disp_message (WindowID2, String$'-14s' + [Energy2,Correlation2,Homogeneity2,Contrast2]$'6.3f', 'window', 12, 12, 'white', 'false')
最后
以上就是曾经胡萝卜最近收集整理的关于《HALCON机器视觉与算法原理编程实践》第9章 特征提取-学习笔记的全部内容,更多相关《HALCON机器视觉与算法原理编程实践》第9章内容请搜索靠谱客的其他文章。
发表评论 取消回复