LabVIEW如何估计图像的位深
LabVIEW如何估计图像的位深视频号
LabVIEW如何估计图像的位深B站
在NI视觉助手中,打开16位图像时,有一个估计图像的位深的功能,其是基于图像的值来估计的。原理上就是根据当前图像的最大值来估计图像可能的位深,例如说10位深的相机最大输出值就只能是1023,那么得到的图像的最大值如果没有超过1023,那么视觉助手就认为这个图像是10位的;而如果是12位深的相机最大输出值则是4095,如果图像中有值在1024~4095之间,那么就认为这个图像是12位的深度。在LabVIEW Vision的环境中,则没有这样的位深估计函数。要想实现这样的功能,那就只能自己写位深估计函数。当然实现起来也是非常简单的,和视觉助手中的原理一样,根据图像中的最大值做判断即可。
视觉助手中基于图像的值估计位深
估计位深前面板和接线端
估计位深.vi程序框图
估计位深函数的实现也是比较简单的,使用直方图函数得到图像中的最大值,然后根据最大值的区间范围来判断图像的位深。
直方图函数
直方图函数的Histogram Report中有最大值的输出
得到最大值后,就可以根据最大值所在的区间范围来判断图像的位深了。Histogram Report中的Maximal Value是SGL单精度浮点形,非整数类型的数据,是不能直接用于比较是否相等的,所以这里加了一个强制转换为U16的类型,将SGL转换为U16,其实不加这个转换也是可以的,直接将SGL连接到后面的区间判断的条件结构中,会自动强制转换为整数,不过这时转换得到的数据类型是I32。这里为了规范,还是直接强制转换为了U16。之后就是区间判断了。8位深的图像值范围是0~255;10位深的图像值范围是0~1023;12位深的图像值范围是0~4095;14位深的图像值范围是0~16383;16位深的图像值范围是0~65535。这里不考虑9位、11位、13位、15位这样的奇数位的,确实是没有看到过奇数位深度的。虽然理论上也是可以有奇数位的。另外,像14、16这样的有没有必要判断,需要自行考虑,实际应用中,作者就没有看到过有哪款相机的ADC能有14位或16位的,能到12位的就已经是比较好的了,有一些差一些的图像传感器,ADC还只有10位的。当然,在视觉助手中,因为读取图像的U16或I16,总是认为图像是16位而非8位,所以其在估计位深时,即使最大值小于255,也认为是10位的,并不考虑8位,在我们这里讨论时,则将小于255的图像估计为8位。下面来看一下效果:
LabVIEW如何估计图像的位深.vi程序框图
最大值176估计位深是8位
最大值750估计位深是10位
最大值1227估计位深是12位
最大值1799估计位深是12位
最大值2842估计位深是12位
最大值4095估计位深是12位
最大值7095估计位深是14位
最后的最大值7095是在最大4095的图像基础上,使用了加法,加了3000的常量后得到的。实际的12位的芯片的工业相机输出的最大值只能是4095的图像。
得到了位深函数后,可以在后面使用我们前面介绍的视频,来显示RGB64位图像,或者是设置图像的位深等操作。
LabVIEW如何显示RGB64彩色图像视频号
LabVIEW如何显示RGB64彩色图像B站
在后面可以加设置位深的函数来设置不同的位深,以显示不同的效果:
估计位深+设置位深
要设置位深,需要将Image控件的调色板模式改为彩虹模式或其他非二值、灰度图像,同时将16位映射方式改为默认值或Most Significant Bits最高有效位,如果是使用是全动态或其他方式,则可能无法区别显示设置的位深的效果。
将16位图像显示映射的转换方法改为默认值或最高有效位
下面是同一幅图像设置不同位深时的彩虹调色板的显示的不同效果:
设置位深为12位时效果
设置位深为13位时的效果
设置位深为14位时的效果
设置位深为15位时的效果
设置位深为16位时的效果
VI版本LV2020SP1: