《HALCON机器视觉与算法原理编程实践》第9章 特征提取-学习笔记

9.1 区域形状特征

在场景中选择物体的特征是图像测量或者识别的重要基础。

9.1.1 区域的面积和中心点
dev_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 封闭区域(孔洞)的面积
*清空显示窗口
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 : )
在这里插入图片描述

*清空显示窗口
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 根据特征值创建区域

在这里插入图片描述

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

在这里插入图片描述

dev_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 :计算指定区域的灰度特征值
在这里插入图片描述

gray_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,
在这里插入图片描述

*读取输入图像
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 提取图像的纹理特征

在这里插入图片描述

dev_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')
  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级D洋葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值