LabVIEW8位2D图像数组保存为图像(非NI VISION方法)
在某些情况下,相机输出的图像可能只是一个二维数组,例如像大恒图像的水星USB2系列的相机,在LabVIEW中使用DLL调用时,输出的就是一个二维数组。又或者是某些情况下,我们通过IMAQdx Get Image Data VI函数获取了相机的原始数据,也是一个一维数组(可以转换为二维图像数组)。得到了这些图像数组后,更多的可能需要将其以图像形式保存到本地硬盘中。当然,比较简单的方法,是使用NI VISION中的Write写函数直接保存成图像。也相对比较方便。但是NI VISION是需要授权许可的(不清楚File文件是不是需要授权,部分简单函数可能不需要授权,没有具体验证过)。所以,我们还有没有其它的方法,可以不使用NI VISION中的写函数来保存图像吗?方法当然还是有的,就是使用LabVIEW平台本身的图形格式函数:
图形格式函数中的可用函数
在编程>图形与声音>图形格式选板中,有写入JPEG文件、写入PNG文件、写入BMP文件,读取JPEG文件、读取PNG文件、读取BMP文件等几组读写图像文件的函数,另外还有一个平化像素图像、还原像素图的函数。这个就是将二维图像数组转换为图像数据的功能函数,或者是将图像数据转换为二维数组的函数。而读写功能中,是使用JPEG、PNG还是BMP,则需要自己考虑,JPEG压缩比较大,图像质量较差,但是图像小,占用硬盘空间少;PNG在图像质量和图像大小之间有一个比较折中的取值,有一定的压缩,但是不是很严重;BMP则是不压缩的,图像大小则最大。
8位2D图像数组保存为图像前面板
8位2D图像数组保存为图像-8位灰度图像程序框图
8位2D图像数组保存为图像-24位或32位彩色图像程序框图
在本例子中,我们使用了平化像素图像函数:
平化像素图函数
这个函数在转换彩色图像时,该函数可以转换1位像素图、4位像素图、8位像素图(灰度图)、24位像素图(RGB彩色图像)。一般常用的是8位灰度图和24位彩色图像。如果是彩色图像,直接输入24位像素图的二维数组即可(32位的彩色图像,是加了一个Alpha透明通道,在LabVIEW中是不怎么支持透明通道的),其它的颜色、掩码、左上角参数都不需要理会。而如果是转换8位的灰度图像,则需要提供颜色参数,这里的颜色参数官方说明为“颜色是RGB颜色的数组,与连接至像素图的值对应。连接的像素图可确定LabVIEW如何读取输入的值。 如连接数据至24位像素图,LabVIEW可忽略该输入。如连接数据至8位像素图,数组有256个元素。如连接数据至4位像素图,数组有16个元素。如连接数据至1位像素图,数组有2个元素。如除24位像素外,颜色数组为空,则图形使用默认的LabVIEW颜色选板。”这个参数,其实就是一个调色板,作用就是如何转换图像数据。如果是24位时,可以使用内部默认的调色板,直接转换即可。而如果是8位的灰度图像,则需要指定相应的调色板。可以通过读取PNG文件函数,来读一张灰度图像,而获取相应的调色板值。当然也可以自己构造这个调色板。8位灰度图像时,共有256个元素,每个元素使用一个颜色值为表示,这个颜色值可以使用RGB转换为颜色值的方式获取,即十六进制表示的xAABBCC形式的值,AA表示的是红色值的转换方式(0-255,十六进制为0-FF),BB表示的是绿色值的转换方式,CC表示的是蓝色值的转换方式。一般来讲,灰度图像中的0,其AA、BB、CC都使用0来表示,灰度图像中的128,则AA、BB、CC都使用128来表示,即通常的AA、BB、CC是相等的,且等于灰度图像中的原始值。当然也可以使用其它的一些查找表,例如将10以下的灰度值,其RGB都表示成0,250以上的灰度值,则都表示为255。RGB值与颜色值的转换可以使用NI VISION中的函数IMAQ ColorValueToInteger(需要安装NI VISION模块,如果没有安装则没有该函数),也可以使用LabVIEW中的函数RGB至颜色转换(在编程>图形与声音>图片函数选板中,LabVIEW安装时自带该函数):
R=0,G=0,B=0,颜色为为x000000
R=128,G=128,B=128,颜色为为x808080
R=255,G=255,B=255,颜色为为xFFFFFF
也可以利用这个函数生成一个数组,从而得到一个调色板,或者是通过读的方式直接得到一个灰度图像的调色板颜色。
只要将像素图平化为图像数据后,后面再加一个写图像文件函数即可。一般使用默认值,即直接连接到图像数据接线端即可。路径可以不用填,压缩也可以使用默认值。
如果8位灰度图像不连接颜色,则出错
如果保存灰度图像时,不连接颜色接线端,则数据类型无效,会提示错误。而这里的错误提示,其实是不清不楚的,一般来看不出哪里有问题。
正常保存后的8位灰图像及属性
以上就是直接使用LabVIEW平台中的写图像函数来保存二维图像数组数据的方法。其它JPEG、BMP格式的方法与此类似,自己修改即可。