LabVIEW感兴趣区域分析(实战篇—1)

简介: LabVIEW感兴趣区域分析(实战篇—1)

目录

1、ROI定义及实现方法


2、基础案例:图像感兴趣区域手动标记


3、进阶案例:图像颗粒自动标记


ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。在Halcon、OpenCV、Matlab等机器视觉软件上常用到各种算子(Operator)和函数来求得感兴趣区域ROI,并进行图像的下一步处理。为图像处理设定ROI,可以将注意力集中在要解决问题的主要方面,减少要处理的数据量,提高系统的处理速度和实时性。


在机器视觉系统开发过程中,常见的ROI操作包括构建ROI、关联ROI到图像显示窗口、从图像显示窗口中提取ROI以及清除图像显示窗口中的ROI等。图像显示窗口中的图像不断变化时,与之关联的ROI可以保持不变。


ROI可通过各种标准几何形状或自由的封闭域来描述。从数据结构角度来看,ROI自身并不包括图像数据,它只是说明图像中哪个区域的数据需要被重点关注。


1、ROI定义及实现方法

Nl Vision使用ROl Descriptor数据结构描述ROI,下图显示了该数据结构及其图解。

image.png


由图可知,ROI可以由其矩形边界(global rectangle)和一个或多个不同的轮廓(contours)共同定义。矩形边界是指一个底边与图像底边平行,且恰好包含整个ROI的矩形,该矩形左上和右下顶点的坐标保存在ROI数据结构中的Global Rectangle数组中。ROI区域可以通过一个或多个几何轮廓来限定,这些不同几何轮廓所定义区域的交集构成了整个ROI。


用于限定ROI区域的轮廓也保存在一个称为Contours的数组中,数组的每个元素由特征ID、类型(type)和包含多个坐标值的数组Coordinates构成。特征ID用来说明该元素描述的轮廓是ROl的外边沿(external)还是内边沿(internal)。如果为外边沿,则其内部的所有区域被看作是ROI区域的一部分;而如果为内边沿,其外部所有部分均被当作是ROI区域的一部分。type值指定了元素所描述轮廓的几何形状。Coordinates数组中每两个元素构成了轮廓中多个顶点的坐标。


由此可见,Contours数组中的元素定义的轮廓本质上用于描述图像中某个区域,而单个或多个元素共同描述的轮廓所限定区域的交集就是最终希望得到的ROl。


在LabVIEW中使用Nl Vision定义ROl的方法大致可分为交互式、程序代码定义以及图像遮罩转换三大类,如下表所示。

image.png

交互方式定义ROl时,需要用户使用各种ROI工具在图像中指定ROI区域,采用交互方式定义ROI可以减少程序代码的编写量,但在程序运行过程中需要用户参与。由于用户的操作习惯和操作环境千差万别,因此即使同一图像同一用户每次绘制的ROI也可能不同。如果要减少用户参与,精确定义ROI,则可通过程序代码来实现。相应地,开发人员也要花更多的精力研究如何在图像中精准确定ROI位置,并编写代码。最后,ROI也可以与图像遮罩相互转换,因此使用图像遮罩也可以定义ROI。


机器视觉系统开发过程中,常用到的几何形状有点、线段、矩形和环面。下表列出了几何形状简易数据结构与ROl Descriptor之间相互转换的VI:

image.png

除了以上介绍的ROI转换VI,Nl Vision还提供了其他几个与ROI操作相关的重要VI,包括图像遮罩(lmage Mask)与ROI相互转换的VI、ROI组合与拆分、ROI在不同坐标系之间的转换以及将已标记的图像(Label lmage)区域转换为ROl的VI。这些VI可参考说明手册理解:

image.png



查看ROI转换VI,在LabVIEW程序框图中点击鼠标右键,查看视觉与运动相关函数,查看Vision Utilities模块中的Region of Interest,步骤如下所示:

image.png



Region of Interest包含VI如下所示:

image.png



用户可结合说明手册,使用相关的Region of Interest VI。


2、基础案例:图像感兴趣区域手动标记

本案例使用ROI构建器以交互方式定义ROI的程序界面和程序代码,如下所示:

image.png



案例功能描述如下所示:


程序开始先将图像CSDN.png读入内存等待进一步处理。

紧接着由While循环和事件结构组成的事件处理器待命,随时准备处理各种用户界面事件。

当用户单击Display Image按钮时,Showlmg Value Change事件分支中的IMAQ WindSetup和IMAQWind Draw就把内存中的图像绘制在一个独立的外部图像显示窗口中。

若用户随后单击ConstructROI按钮,DefROl Value Change事件会被触发,其对应事件分支中的IMAQConstructROI将创建ROI构造器。由于传递给它的窗口编号为0,与之前IMAQWind Draw绘制的外部图像显示窗口编号(默认值窗口编号为0)一致,因此,IMAQConstructROl会将0号编号的图像显示窗口临时变为模态窗口形式的ROI构造器并在其右侧显示ROI工具条。

当用户在ROI构造器中定义好感兴趣区域并确认后,程序就返回所定义区域所对应的ROl Descriptor。

此时,若用户再次单击Display lmage按钮,就会发现之前定义的ROl显示在窗口中,说明它已经与该窗口关联。

注意,在交互方式下,若构造器指定了窗口编号,则创建的ROI会自动与该窗口关联。若要使用程序代码将ROI Descriptor描述的ROI与图像显示窗口关联,可以使用IMAQ WindSetROl。如果要清除图像显示窗口中的ROI,可以单击Erase ROI按钮,它将触发EraseROl Value change事件,调用IMAQ WindEraseROI清除ROI。

最后,单击Exit按钮退出程序时,IMAQ WindClose和IMAQ Dispose会清理现场,结束程序。

项目演示效果如下所示:

image.png



项目程序下载:https://download.csdn.net/download/m0_38106923/16745449


3、进阶案例:图像颗粒自动标记

图像标记 (Label lmage)操作常用于颗粒(Particles)分析,它把二值图像中相互连通的一组像素(称为颗粒)全部更改为某一固定灰度值(用8位或16位表示)。可通过4连通或8连通原则来判断像素是否属于同一颗粒。图像标记操作的输入图像为二值图像,但其输出却是含有为每个颗粒都设置了灰度标记值的灰度图像,其中灰度标记值的数量等于图像中颗粒的数量再加上用于背景的灰度标记值0。如果图像使用了调色板,则被标记的多个颗粒有可能使用同一灰度标记值。


本案例是一幅图像中颗粒进行标记的实例程序,如下所示:

image.png



案例功能描述如下所示:


程序代码在将图像Alu.png读入内存后即进入图像标记循环。

在循环中,若用户没有改变IMAQ Threshold使用的阈值,则循环就不做任何处理,否则就会对图像中的颗粒或区域进行标记。

标记的过程是先用IMAQ Threshold将图像分割为二值图像,再经形态学处理函数IMAQ Morphology对颗粒或区域的边缘做平滑处理,随后才由IMAQ Label(位于LabVIEW的Vision andMotion→lmage Processing→Processing函数选板中)将各区域内的像素修改为灰度标记值。

除了对图像标记,程序还返回已标记的颗粒数,并使用IMAQ Quantify返回各标记区域的像素灰度统计信息,IMAQ Quantify的Image Mask参数必须为标记图像。

完成了图像的标记,就可以设法将已标记图像中的某一感兴趣部分提取出来单独分析。IMAQ LabelToROI可以把图像中已标记区域转换为ROI。如果某个标记值对应多个区域,则其返回的ROlDescriptor将包含多个区域的轮廓。在使用它时还可以指定是否仅转换ROI外部轮廓和ROI包含的最大像素个数,以进一步约束转换结果。

项目演示效果如下所示:

image.png


案例:LabVIEW图像颗粒自动标记


项目程序下载:https://download.csdn.net/download/m0_38106923/16745885


相关文章
|
6月前
|
编解码 数据可视化 小程序
微信小游戏开发(第一篇
微信小游戏开发(第一篇
300 0
|
缓存 图形学
《unity游戏优化》第一章读书笔记
《unity游戏优化》第一章读书笔记
|
机器学习/深度学习 传感器 数据采集
对LabVIEW的一点感想
对LabVIEW的一点感想
124 0
LabVIEW的编程-程序框图入门笔记
LabVIEW的编程-程序框图入门笔记
286 0
|
安全
游戏开发零基础入门教程(12):从想法到设计的过程
一个游戏通常开始于一个想法,这个想法可以是千奇百怪的,可以是五花八门的,甚至可以是可笑的。不论如何有一个想法,是一个游戏的开端。当你有了一个想法了以后,如果你希望它最终能够变成一个真正的游戏,那么你就必须要继续往前走,反复的思考,雕琢你的粗糙的想法,将它细化,形成一份具体的可行的游戏设计方案。
125 0
|
开发工具
经典飞机大战游戏制作教程1:熟悉开发工具
适合想要学习做游戏的新手,也适合想要学习编程的青少年,另外也适合亲子共学。 想让孩子学习一样东西,除了让他自己去学习之外,还有一种更好的方式,就是跟他一起学习。希望这个系列能够让你体会到做游戏的乐趣,并且在做游戏的过程中学习编程,锻炼逻辑思维。 如果课程内容对你有帮助,欢迎点赞分享,鼓励小蚂蚁继续创作。
215 0
|
存储 Unix Linux
LabVIEW编程入门笔记
LabVIEW编程入门笔记
128 0
|
SQL 数据库
实战:第二章:关于EZDML工具使用踩的坑
实战:第二章:关于EZDML工具使用踩的坑
178 0
【仿真建模】第一课:AnyLogic入门基础教程 - 行人库入门讲解
点击面板,选择第三个图标,就是行人库行人库分为两个区域(空间标记和模块)从左边拽一个矩形墙出来把墙的外观的填充类型改为无填充拽两条目标线出来拽一个pedSource模块出来,作用是设置人的起始点设置目标线为左边的那条同样的,拽出一个Ped GoTo,作用是设置人的目的地,设置它的目标线为右边的那条最后,拽一个PedSink出来,作用是将到达目的地的人进行销毁点击运行加速播放运行效果展示。
877 0
【仿真建模】第一课:AnyLogic入门基础教程 - 行人库入门讲解
|
存储 算法 数据处理
第一章 51单片机开发入门知识介绍
第一章 51单片机开发入门知识介绍
296 0