【Halcon机器视觉】ch9.1 特征提取

特征,就是事物的特定属性,如大的、小的、方形的、圆形的,通过这些特征我们可以找出想要的目标。

在图像处理方面,图像的特征描述了图像某种特性,如面积大小就是区域的一种特征,通过分割形态学得到一些图像区域之后,就可以使用计算的特征作为依据去提取想要的区域,本章将介绍特征即其计算特征的算子。

特征的类型有很多,此章主要介绍如何使用面积、灰度差异大的、区域面积中心等特征进行目标提取。

9.1 区域形状特征

使用形状特征为目标提取依据是较为常见的,下面就介绍与区域形状特征相关的算子。

9.1.1 区域面积和中心点

使用区域面积和中心点坐标可以作为区域选择和定位,如挑选区域最大的区域,area_center就是实现这功能的算子。下面例程将演示如何计算孔洞面积并在孔附近打印显示面积数值。
输入图像:
在这里插入图片描述
处理程序:

*清空显示
dev_close_window()
*读取一张照片
read_image(Image, 'quan1')
*获取图像尺寸
get_image_size(Image, Width, Height)
*显示
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_display(Image)
*转为灰度图像
rgb1_to_gray(Image, GrayImage)
*划分AOI区域 并提取  等价于==gen_rectangle1()+reduce_domain()
rectangle1_domain(GrayImage, ImageReduced, 100, 150, Height-60, Width-100)
*自适应阈值分割 提取暗的部分
binary_threshold(ImageReduced, Region, 'max_separability', 'dark', UsedThreshold)
*显示暗部
dev_clear_window()
dev_display(Region)
*将联通区域分开
connection(Region, ConnectedRegions)
*获取图像面积和中心坐标
area_center(ConnectedRegions, Area, Row, Column)
*获取不连通区域数量
count_obj(ConnectedRegions, Number)
for i:=1 to Number by 1
   *设置显示对象颜色
   dev_set_color('red')
   select_obj(ConnectedRegions, ObjectSelected, i)
   *设定文字输出的起始坐标点
   set_tposition(WindowHandle, Row[i-1]+60, Column[i-1])
   *设定输出文字颜色
   dev_set_color('blue')
   *设定字体
   set_font(WindowHandle,'-System-24-*-0-0-0-1-GB2312_CHARSET-')
   *输出文字内容
   write_string(WindowHandle, Area[i-1])
endfor

输出图像:
在这里插入图片描述
从控制变量窗口可以看到5个区域面积以及其行坐标和列坐标,上面程序就是通过坐标去确定显示面积文字的坐标的。

9.1.2 封闭区域(空洞)面积

使用area_holes算子可以计算图像中封闭区域的面积,该面积是指区域内所有孔洞包含的像素数。
输入图片:
在这里插入图片描述
处理程序:

*清空显示
dev_close_window()
*读取一张照片
read_image(Image, 'quan1')
*获取图像尺寸

get_image_size(Image, Width, Height)
gen_rectangle1(Rectangle,100, 150, Height-60, Width-100)
*将区域分离出来
reduce_domain(Image, Rectangle, ImageReduced)
*将区域剪裁下来
crop_domain(ImageReduced, ImagePart)

get_image_size(ImagePart, Width1, Height1)
*显示
dev_open_window(0, 0, Width1, Height1, 'black', WindowHandle)
dev_display(ImagePart)
*转为灰度图像
rgb1_to_gray(ImagePart, GrayImage)
*自适应阈值分割 提取暗的部分
binary_threshold(GrayImage, Region, 'max_separability', 'light', UsedThreshold)
*计算所有空洞面积和
area_holes(Region, Area1)
*显示暗部
dev_clear_window()
dev_display(Region)
*将面积以字符串信息显示在窗口中
disp_message(WindowHandle, 'Size of all holes= ' +Area1+' pixel', 'window', 12, 12, 'black', 'true')

在这里插入图片描述
对比上一个例程,这里的binary_threshold算子参数要选择‘light’,提取亮部,则暗部不被提取到形成了孔洞区域,area_holes算子就计算了五个孔洞像素总数。

9.1.3 根据特征值选取区域

在提取特征值,比较常用的算子是select_shape算子,它能够根据特征提取符合条件的区域。该算子原型为:

select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )

参数中Features可选多种,常用的一种就是前面所用到的面积,如下,面积符合大于等于4405和小于等于99999的区域,就会被选取出来。

select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 4405, 99999)

输入图像:
在这里插入图片描述

*清空显示
dev_close_window()
*读取一张照片
read_image(Image, 'quan1')
*获取图像尺寸
get_image_size(Image, Width, Height)
*显示
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_display(Image)
*转为灰度图像
rgb1_to_gray(Image, GrayImage)
*划分ROI区域 并提取  等价于==gen_rectangle1()+reduce_domain()
rectangle1_domain(GrayImage, ImageReduced, 100, 150, Height-60, Width-100)
*自适应阈值分割 提取暗的部分
binary_threshold(ImageReduced, Region, 'max_separability', 'dark', UsedThreshold)
*显示暗部

dev_clear_window()
dev_display(Region)
*计算所有空洞面积和
*area_holes(Region, Area1)
*将面积以字符串信息显示在窗口中
*disp_message(WindowHandle, 'Size of all holes= ' +Area1+' pixel', 'window', 12, 12, 'black', 'true')

*将联通区域分开
connection(Region, ConnectedRegions)
*获取图像面积和中心坐标
area_center(ConnectedRegions, Area, Row, Column)
*获取不连通区域数量
count_obj(ConnectedRegions, Number)

select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 4405, 99999)
dev_clear_window()
dev_display(SelectedRegions)

面积大于等于4405和小于等于99999的区域被选出来
在这里插入图片描述
如果把Features换为宽度,并设置合适的Min,Max值,如下。

select_shape(SelectedRegions, SelectedRegions1, 'width', 'and', 80, 99999)
dev_clear_window()
dev_display(SelectedRegions1)

宽度大于等于80小于等于99999的区域被选出来。
在这里插入图片描述

9.1.4 根据特征值创建区域

根据区域的形状特征,可以从区域集合中选择特定的区域。除此之外,Halcon提供可以根据区域特征创建新的形状。例如,通过创建最小外接矩形,可以将不规则的形状转化为规则的区域。或者寻找最大的内接圆,以计算孔径。如以下列举的几个算子。

1. inner_circle算子

此算子用于计算一个区域的最大内接圆(Largest inner circle of a region),其原型如下:

inner_circle(Regions : : : Row, Column, Radius)

参数解释:

  • Regions(输入):表示输入的区域
  • Row和Column(输出):表示最大内接圆的圆心坐标
  • Radius(输出):表示最大内接圆的半径

使用例程如下,采取了inner_circle去计算硬币的输入图像最大内接圆。
输入图片:
在这里插入图片描述

程序代码:

*清楚显示
dev_close_window()
*读取图片转化为灰度并显示
read_image(Image, 'ic')
get_image_size(Image, Width, Height)
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
rgb1_to_gray(Image, GrayImage)
*自动阈值分割1
binary_threshold(GrayImage, Region, 'max_separability', 'dark', UsedThreshold)
*分离不连通区域
connection(Region, ConnectedRegions)
*计算各区域面积 并分割最大者
area_center(ConnectedRegions, Area, Row, Column)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 99999)
*计算最大内置圆
inner_circle(SelectedRegions, Row1, Column1, Radius)
dev_clear_window()
dev_display(SelectedRegions)
*画圆
gen_circle(Circle, Row1, Column1, Radius)
*设置显示样式 颜色 无填充 和线宽
dev_set_window(WindowHandle)
dev_set_color('blue')
dev_set_draw('margin')
dev_set_line_width(3)
*显示原始图片和圆
dev_display(Image)
dev_display(Circle)

输出图片:
在这里插入图片描述
从控制变量监控窗口中可见圆的半径为90.5个像素。

2. Smallest_rectangle2算子

此算子用于计算最小外接矩形。原型如下:

smallest_rectangle2(Regions : : : Row, Column, Phi, Length1, Length2)

参数解释
Regions(输入):表示输入区域
Row、Column(输出):表示计算的最小外接矩形的中心坐标
Phi(输出):表示矩形偏转角度,大小在-pi/2到pi/2之间
Length1, Length2(输出):表示矩形两个方向的内径,即边长的一半

由下一个例程,采用smallest_rectangle2算子计算螺丝的最小外接矩形尺寸。
输入图像:

在这里插入图片描述
处理代码:


*清空显示
dev_close_window()
*读取一张照片
read_image(Image, 'luosi1')
*获取图像尺寸
get_image_size(Image, Width, Height)
*显示
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_display(Image)
*转为灰度图像
rgb1_to_gray(Image, GrayImage)
*自适应阈值分割 提取暗的部分
binary_threshold(GrayImage, Region, 'max_separability', 'dark', UsedThreshold)
connection(Region, ConnectedRegions)
select_obj(ConnectedRegions, ObjectSelected, 1)
smallest_rectangle2(ObjectSelected, Row, Column, Phi, Length1, Length2)
gen_rectangle2_contour_xld(Rectangle, Row, Column, Phi, Length1, Length2)
dev_set_window(WindowHandle)
dev_set_draw('margin')
dev_set_line_width(3)
dev_display(Image)
dev_display(Rectangle)

输出图像:
在这里插入图片描述
从控制变量监控窗口中可见最小外接矩形的几个输出参数数值,在有需要时可以使用。

3. Smallest_rectangle1算子

此算子也是用于计算输入区域的最小外接矩形,但同上述的Smallest_rectangle2算子不同的是,此算子所计算的矩形与图像水平坐标轴平行,不会发生旋转,其原型为:

smallest_rectangle1(Regions : : : Row1, Column1, Row2, Column2)

参数解释
Regions(输入):表示输入区域
Row、Column(输出):表示计算的最小外接矩形的中心坐标
Phi(输出):表示矩形偏转角度,大小在-pi/2到pi/2之间
Length1, Length2(输出):表示矩形两个方向的内径,即边长的一半

输入图片同为上述。
处理程序:

*清空显示
dev_close_window()
*读取一张照片
read_image(Image, 'luosi1')
*获取图像尺寸
get_image_size(Image, Width, Height)
*显示
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_display(Image)
*转为灰度图像
rgb1_to_gray(Image, GrayImage)
*自适应阈值分割 提取暗的部分
binary_threshold(GrayImage, Region, 'max_separability', 'dark', UsedThreshold)
connection(Region, ConnectedRegions)
smallest_rectangle1(ConnectedRegions, Row1, Column1, Row2, Column2)
gen_rectangle1(Rectangle1, Row1, Column1, Row2, Column2)

dev_set_window(WindowHandle)
dev_set_draw('margin')
dev_set_line_width(3)
dev_display(Image)
dev_display(Rectangle1)

输出图片:
在这里插入图片描述
小结

  • 区域面积及和中心点坐标信息:area_center()
  • 封闭区域孔洞的面积:area_holes()
  • 根据特征值选择区域:select_shape() 可以根据不同特征选取区域
  • 根据特征值创建区域:inner_circle()
  • 求最小外接矩形:smallest_rectangle2() 矩形与物体方向平行。smallest_retangle1()矩形和坐标轴平行
  • 基于灰度值的特征:gray_features() 获取图像最大最小灰度值
  • 区域最大、最小灰度值:min_max_gray()
  • 灰度区域的面积和中心:are_center_gray() 求的是重心
  • 根据灰度值选择区域:select_gray()
  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值