提示:文章参考了网络上其他作者的文章,以及相关书籍,如有侵权,请联系作者。
前言
在场景中选择物体的特征是图像测量或者识别的重要基础。区域的形状特征是非常常用的特征,在模式匹配中,常使用形状特征作为匹配的依据。下面就介绍几种常用的与区域形状特征相关的算子。
一、区域的面积和中心(area_center)
提到区域的特征,最常用的莫过于区域的面积和中心点坐标信息。实际工作中,经常会使用面积或中心点进行特征的选择和定位。Halcon中的area_center算子就是用于实现这一功能的,该算子一次返回以下两个结果。
1)、面积:指的是单个区域(输入区域可能不止一个)中包含的灰度像素数量。
2)、中心:指的是几何中心点坐标,即单个区域的中心点行坐标均值和列坐标均值。
以一个例子说明,下面左图为输入的图像;中图为阈值分割后的图像,其中较亮部分为提取的区域,这些区域将作为area_center 算子的输入;右图为求面积与形状中心坐标的结果。其中文字标注的是对应区域的面积,文字的位置为中心位置设置行方向偏移后的位置。
上面右图中第三个孔的中心坐标在控制变量窗口中可以看到,把鼠标放在圆孔的中心,可以从界面右下角的鼠标位置看到鼠标坐标值与控制变量中的值一致。
上述过程的代码如下:
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
该代码实现了将输入图像中的较暗的孔洞区域提取出来,计算各个独立区域的面积和中心坐标,并输出各区域的面积。
二、封闭区域(孔洞)的面积(area_holes)
除了可以用area_center算子计算区域的面积以外,在Halcon中还可以使用area_holes算子计算图像中封闭区域(孔洞)的面积。该面积指的是区域中孔洞部分包含的像素数。一个区域中可能不只包含一个孔洞区域,因此该算子将返回所有孔洞区域的面积之和。
下面左图为输入的灰度图像,右图为经阈值分割并输出了孔洞面积的图像,其中深色部分为提取的孔洞区域,红色部分为包含孔洞的区域,也是area_holes算子的输入。
上述过程的代码如下:
*清空显示窗口
dev_close_window ()
*读取包含孔洞的图片
read_image (Image, ''data/holes2')
*打开新的显示窗口
dev_open_window_fit_image (Image, 0, 0, -1, -1, wWindowHandle)
*将彩色图像转化为灰度图像,这是为了后面的图像二值化
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')
该代码实现了将输入区域中的孔洞部分提取出来,并计算孔洞的面积之和。
三、根据特征值选择区域(select_shape)
关于提取图像的特征,比较常用的一个算子是select_shape算子,它能高效地根据特征提取出符合条件的区域。该算子的原型如下:
select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )
参数1和参数2分别表示输入和输出的区域,值得关注的是参数3 Features。这里提供了一个包括多种特征参数的列表,基本包括了区域的常用特征,使用者只需要选择需要的特征,并设置筛选条件,就能得到需要的区域。
1)、area:输入区域的面积。
2)、row:输入区域中心点的行坐标。
3)、column:输入区域中心点的列坐标。
4)、width:输入区域的宽度。
5)、height:输入区域的高度。
6)、circularity:输入区域的圆度。
7)、compactness:输入区域的紧密度。
8)、convexity:输入区域的凸包性。
9)、 rectangularity:输入区域的矩形度。
10)、outer_radius:输入区域的最小外接圆的半径。
11)、inner_radius:输入区域的最大内接圆的半径。
12)、inner_width:输入区域的与坐标轴平行的最大内接矩形的宽度。
13)、inner_height:输入区域的与坐标轴平行的最大内接矩形的高度。
14)、connect_num:输入区域中非连通区域的数量。
15)、holes_num:输入区域包含的孔洞数量。
16)、max_diameter:输入区域的最大直径。
在检测中,常常使用某个特征值作为分割的依据,这时使用select_shape算子就非常高效,仅用简洁的代码就能将这些区域提取出来。例如,我们常利用面积特征来筛选出较大的前景目标,移除杂点和小区域。使用select_shape算子进行面积筛选,无须单独计算每个区域的具体面积,代码也非常简洁。
这里有一个要注意的地方,就是算子中Operation的取值。如果你预先要同时检测多个面积为[min,max]的目标,则在 select_shape语句中用’and’。 检测结果如果没有多个, SelectedRegions为空(要么取出两个以上,不够两个就什么都不取----以标明有错!)。
如果你预先不知道能有几个面积为[min,max]的区域,用 select_shape时取‘or’ 合适,如果有多个就取多个,有一个就取一个(or —有几个满足的区域,就取几个!)
下面是一个使用 select_shape 算子进行特征筛选的例子,如下图所示。左图为输入的彩色图像,图中有若干个孔洞。为了将最大的孔洞从图中提取出来,先使用阈值处理,从ROI中提取出较亮的区域;然后使用 select_shape 算子根据面积area筛选,将大部分杂点排除掉,得到中图所示的形状;接着再用一次select_shape算子,使用区域宽度width作为判断条件,选择出大的孔。右图为使用select_shape 算子进行特征提取的图像,经过第二次筛选,将包含较大孔洞的区域提取出来。
上述过程的代码如下:
*清空显示窗口
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)
该段代码中列举了3种选择最大目标的方法。方法一是直接根据面积的值设置选择标准;方法二分为两步操作,先计算面积,再选择出面积最大的形状;方法三是通过在select_shape_std算子中设置max_area,直接提取出面积最大的形状。3种方法得到的结果相同。这样即可将符合条件的区域提取出来。
注意:可以根据检测需要组合使用多种选择条件,多次使用select_shape算子,以筛选出合适的区域。文章来源:https://www.toymoban.com/news/detail-453386.html
四、根据特征值创建区域
inner_circle算子
smallest_rectangle2算子
参考文献
1、Halcon机器视觉算法原理与编程实战/杨青编著.北京大学出版社文章来源地址https://www.toymoban.com/news/detail-453386.html
到了这里,关于Halcon区域形状特征-area_center、area_holes、select_shape、inner_circle和smallest_rectangle2算子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!