Halcon区域形状特征-area_center、area_holes、select_shape、inner_circle和smallest_rectangle2算子

这篇具有很好参考价值的文章主要介绍了Halcon区域形状特征-area_center、area_holes、select_shape、inner_circle和smallest_rectangle2算子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章参考了网络上其他作者的文章,以及相关书籍,如有侵权,请联系作者。


前言

       在场景中选择物体的特征是图像测量或者识别的重要基础。区域的形状特征是非常常用的特征,在模式匹配中,常使用形状特征作为匹配的依据。下面就介绍几种常用的与区域形状特征相关的算子。


一、区域的面积和中心(area_center)

       提到区域的特征,最常用的莫过于区域的面积和中心点坐标信息。实际工作中,经常会使用面积或中心点进行特征的选择和定位。Halcon中的area_center算子就是用于实现这一功能的,该算子一次返回以下两个结果。
       1)、面积:指的是单个区域(输入区域可能不止一个)中包含的灰度像素数量。
       2)、中心:指的是几何中心点坐标,即单个区域的中心点行坐标均值和列坐标均值。
       以一个例子说明,下面左图为输入的图像;中图为阈值分割后的图像,其中较亮部分为提取的区域,这些区域将作为area_center 算子的输入;右图为求面积与形状中心坐标的结果。其中文字标注的是对应区域的面积,文字的位置为中心位置设置行方向偏移后的位置。
Halcon区域形状特征-area_center、area_holes、select_shape、inner_circle和smallest_rectangle2算子
       上面右图中第三个孔的中心坐标在控制变量窗口中可以看到,把鼠标放在圆孔的中心,可以从界面右下角的鼠标位置看到鼠标坐标值与控制变量中的值一致。
Halcon区域形状特征-area_center、area_holes、select_shape、inner_circle和smallest_rectangle2算子
       上述过程的代码如下:

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算子的输入。
Halcon区域形状特征-area_center、area_holes、select_shape、inner_circle和smallest_rectangle2算子
       上述过程的代码如下:

*清空显示窗口
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 算子进行特征提取的图像,经过第二次筛选,将包含较大孔洞的区域提取出来。
Halcon区域形状特征-area_center、area_holes、select_shape、inner_circle和smallest_rectangle2算子
       上述过程的代码如下:

*清空显示窗口
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算子,以筛选出合适的区域。

四、根据特征值创建区域

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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Jvm】运行时数据区域(Runtime Data Area)原理及应用场景

    Jvm由 4个部分 组成,分为2个子系统和2个组件 ,2个子系统为 Class loader(类装载)、Execution engine(执行引擎) ;2个组件为 Runtime Data Area(运行时数据区)、Native Interface(本地接口) 。 Class loader(类加载器) :根据给定的全限定名类名(如:Java.lang.Object)来装载class文件到Runtime data area中的

    2024年02月20日
    浏览(50)
  • 如何将PCB区域修改为板子形状大小(修改黑色区域大小)

    今天给大家分享一下,如何在AD上将PCB区域修改为板子形状大小。 首先我们如果不修改PCB区域(也就是导入PCB后的黑色的区域)的话,都是默认的大小,如下图所示: 我们可以看到,如果我们只想要显示板子,其他区域都去掉,那么需要将PCB修改区域修改为板子形状大小即可。

    2024年01月16日
    浏览(29)
  • 小程序IOS安全区域优化:safe-area-inset-bottom

    最近发现公司的小程序代码中有一些很陌生的代码 safe-area-inset-bottom ,本以为是什么高级用法,查阅资料才发现是我孤陋寡闻了,原来是css的属性。 先来说一下用法及作用: IOS全面屏底部有小黑线,位于底部的元素会被黑线阻挡,可以使用以下样式: 获取高度时,可用:

    2024年02月13日
    浏览(39)
  • OpenCV截取ROI区域——多种形状(圆形)

    背景:在做一个中国象棋机器人的项目,项目中需要识别象棋棋子上的汉字,计划采用CNN的方式实现这一功能。在制作CNN训练的数据集的时候,需要一个截取象棋中心文字的问题。当我们定位到一个象棋的位置之后,我首先将包裹象棋的一个50*50的矩形取阈截取出来,但是,

    2024年02月16日
    浏览(50)
  • vb如何获取鼠标形状的特征码

    vb如何获取鼠标形状的特征码 好像按键精灵有一个GetCursorShape()函数可以获取特征码,不知道VB6能不能实现类似的功能? 附注: 1 最好是机器无关的,不是也可以。 2 特征码就是一串数字,用来区分不同的鼠标形状。 3 获取鼠标形状的位图的操作已经实现,现在就是如何通过

    2024年01月24日
    浏览(26)
  • 华为在ospf area 0单区域的情况下结合pbr对数据包的来回路径进行控制

    配置思路: 两边去的包在R1上用mqc进行下一跳重定向 两边回程包在R4上用mqc进行下一跳重定向 最终让内网 192.168.10.0出去的数据包来回全走上面R-1-2-4 192.168.20.0出去的数据包来回全走 下面R1-3-4 R2和R3就是简单ospf配置和宣告,其它没有配置,这里就不贴上去了。 dis current-config

    2024年02月13日
    浏览(38)
  • Halcon区域几何变换和仿射变换

    算子参数: move_region(Region : RegionMoved : Row, Column : ) 1.Region(输入要移动的区域) 2.RegionMoved(输出移动后区域) 3.Row(输入要移动区域的向量的行距离 point.y ) 4.Column(输入要移动区域的向量的列距离 point.x) 实例: 效果图:

    2023年04月08日
    浏览(58)
  • Halcon常用的画ROI区域的生成保存读取

    算子描述: 1.draw_circle为用户在窗口中交互式创建的圆生成参数。 2.gen_circle根据参数创建一个圆圈。 算子参数: 1.draw_circle( : : WindowHandle : Row, Column, Radius) Ⅰ.WindowHandle(输入窗口句柄) Ⅱ.Row(输出重心的行索引, circle.center.y) Ⅲ.Column(输出重心的列索引,circle.center.x )

    2024年02月06日
    浏览(36)
  • Halcon不改变目标大小尺寸及坐标,放大图像或区域

    如果需要检测一张图像中很细小的物体,计算机可能可以观察到,但人的肉眼很难判别。这时候就需要放大图像中目标所在区域进行观测,放大观察可能会导致图像被放大,目标相对原始图像的坐标大小信息会被改变。如下,分割图中目标所在区域进行放大显示,该操作会改

    2024年02月09日
    浏览(35)
  • halcon中将xld轮廓或者region区域绘制在图像上并保存

    首先是小白现在没有找到xld轮廓直接绘制在图像上面的方法 , 对于 xld轮廓通过转化为region区域 , 之后再绘制在图像上 (与直接显示在图像窗口句柄上面的轮廓有一定区别) -补发——————时隔多日找到新的方法利用:dump_window_image可以将亚像素轮廓绘制在图片上面 如

    2023年04月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包