本文属于LabVIEW & Vision基础性文章,仅适用未入门用户。
使用NI的LabVIEW与Vision设计机器视觉与图像处理程序时,要想获得图像,并且使用IMAQ引用进行图像处理,那么首先都是使用IMAQ Create来创建图像缓存。函数的位置在函数>视觉与运动>Vision Utilities>Image Management>IMAQ Create。如图1所示:
图1 IMAQ Create函数位置
图2 IMAQ Create函数即时帮助
Creates a temporary memory location for an image. Use IMAQ Create in conjunction with the IMAQ Dispose VI to create or dispose of NI Vision images in LabVIEW.
上面图2为IMAQ Create函数的即时帮助,英文为其帮助文档对函数的说明。意思为给图像创建一个临时存储位置,即在内存中开辟一块缓存,用于临时放置图像。在NI LabVIEW中,视觉图像模块通常使用IMAQ Create函数(创建缓存函数)联合IMAQ Dispose函数(清除缓存函数)一起工作,以达到对内存的合理分配使用。
在IMAQ Create函数创建的临时存储位置,都是作为Image图像引用使用的,即后面其它的所有函数,都使用这个地址的引用,并对引用中的图像进行操作。IMAQ Name为创建的引用的名称。在同一个程序中,如果需要分配多个不同的缓存,需要利用IMAQ Name的不同,进行区分。在函数的IMAQ Name接线端上鼠标单击右键>创建>常量,则会创建一个字符串常量,并且会自动命名为Untitled(未命名),用户可以对其进行命名,可以使用英文,也可以使用中文。以经验来看,一个相机的视觉系统,我们至少都需要两个图像缓存,一个为原始图像的缓存,一个为处理图像的缓存。之所以要这样分开,是为了方便图像处理的过程中,不将原始图像改变。因为有些图像处理函数处理过后,原始图像的信息是会丢失许多的,而且是不可逆的,如二值化、滤波、形态学等,而如果在图像处理过程中,在后面的一些函数中还需要原始图像时,这时可以通过复制的过程,将原始图像再复制过来使用,而不会将原始图像用处理后的图像代替了。如果有需要,可能需要三到四个图像缓存。像Image To Image函数就需要四个图像缓存。在NI的VDM中常用的几类图像缓存有:图像源(Image Src)、图像目的地(Image Dst)、图像掩码(Image Mask)、模板(Template)等几类。
图3 Image Type图像类型
在IMAQ Create函数的下面有一个接线端为Image Type图像类型,其可以指定图像缓存用于存储哪种类型的图像,如Grayscale(U8)无符号8位灰度图像、Grayscale(I16)有符号16位灰度图像、Grayscale(SGL)单精度形灰度图像、Complex(CSG)复数形图像、RGB(U32)无符号32位RGB彩色图像、HSL(U32)无符号32位HSL彩色图像、RGB(U64)无符号64位RGB彩色图像、Grayscale(U16)无符号16位灰度图像等类型。其中Grayscale(U8)无符号8位灰度图像、RGB(U32)无符号32位RGB彩色图像两种类型使用的最多,因为一般的工业相机、或摄像头,输出的图像要么都是无符号的8位灰度图像,要么就是无符号的32位RGB彩色图像。图像类型选择不同,分配的缓存空间也不一样,图像类型需要选择正确,不然有可能不能正常显示,如图像源是彩色图像,而图像类型选择为灰度,则会自动转换成灰度图像而不能显示彩色图像。
图4 IMAQ Create Border Size边缘尺寸
图4所示为创建图像缓存时指定边缘尺寸。这个参数的具体帮助如下:
图5 IMAQ Create Border Size帮助
从帮助中,可以了解到其意思为边缘尺寸定义了以像素为单位的围绕图像四周的边缘宽度。这些像素仅用于一些特殊的VI函数。如果图像在后面的处理过程中使用的函数需要边缘,例如分类、形态学等(具体如移除粒子、膨胀、腐蚀等),则需要创建一个边缘在应用程序开始前。函数默认的边缘是3。有3个像素的边缘,可以使用的核心算子(Kernel掩码)可以达到7x7而不需要更改。如果想使用大于7x7的算子在你的处理中,那么需要指定更大的边缘当你创建图像缓存时。
图5所示的帮助中第一个8x6的图像指示了边缘为0的一幅图像,而第二个8x6的图像,表示了有2个像素的边缘,可以使用5x5的核心算子。
需要注意的是图像的边缘仅仅只在图像处理中被引入计算。他不会显示或存储在文件中。
图6 边缘尺寸对掩码的影响
图6 示意了边缘尺寸对核心算子的影响。图中黄色区域表示了一个8x6的图像。如果需要处理红色区域代表的像素,使用7x7的掩码(图6中蓝色区域及蓝黄区域,即红色像素点为中心的7x7像素),那么需要处理的像素点会被置于掩码的中心位置,这时在处理像素的上边与左边,都还需要3个像素的位置来放置掩码。如果这时图像没有边缘,或者是边缘的数量达不到要求——≥(掩码尺寸-1)/2,那么就会报错。如下图7所示的例子:
图7 图像边缘未满足要求时出错
错误为-1074396072,发生于IMAQ Remove Particle移除粒子中,可能的原因是IMAQ Vision:Invalid image border。即无效的图像边缘。因为在IMAQ Remove Particle函数中,默认使用的是3x3的掩码,而我们在创建图像引用时,边缘尺寸设置为0了。因此会报无效图像边缘的错误。如果将边缘尺寸设置为1,再运行同样的程序时,则不会有错误发生,如图8所示:
图8 图像缓存大于等于掩码需求的尺寸时
至于IMAQ Create函数的其它接线端,如New Image,Error In,Error Out等接线端,错误输入、错误输出就不多说了,这个是LabVIEW中最最基本的东西,而New Image为图像缓存的引用输出,是用于后续的图像处理应用的。
在本文中之所以啰嗦的讲这么多IMAQ Create的细节,主要是因为许多初学者确实不太在意这些东西,认为只要创建了,就OK了。其实,这里的创建,会影响到后面的函数。特别是IMAQ Name引用名与Border Size边缘尺寸,这两个参数不注意,极易出错。边缘尺寸不正确,上面已经讲了(通常来讲,不接线直接使用默认的3,出错的机会更少,因为掩码较少使用7x7以上的,^=^),而引用名的出错,通常反应在图像处理过程中,图像内存分配混乱,各阶段的图像在不同的缓存中反复的覆盖。