彩色数据的存储
Labview将彩色数据以U32类型数组存储,有两种方式:RGB(红绿蓝)和HSL(色彩亮度饱和度)。
将彩色图转换为HSL格式,然后提取亮度平面。亮度平面与灰度图像是完全对应的。并且,它是能够提供灰度图像准确表达的唯一颜色平面。
HSL—Hue SaturationLuminance
RGB—Red Green Blue
存储方式如下:
备用 | Red | Green | Blue |
备用 | Hue | Saturation | Luminance |
8bit | 8bit | 8bit | 8bit |
灰度图
大多数图像处理算法都是以灰度图为基础。因此,如何得到灰度图很重要,也是首要步骤。
将一幅图转换为灰度图,就是每个像素点由原来的32位的表示方法压缩到8位表示(可能有16位、24位、32位)的算法有多种,由原来的RGB三色的分量,映射到0~255的灰度值,其方法有多种:
Gray=R*0.3+G*0.59+B*0.11
Gray=(R+G+B)/3
……
归根到底是将彩色对应到灰度值上。
在Labview的Vision开发包内,使用这个工具包的函数中需注意一点,即每个图片打开显示之前,都要给其分配一个内存区域,使用的函数为IMAQ Creat,在分配的时候,一个参数Image type需要指定。常规的使用方法是获取文件的类型后,将类型值赋给这个参数,如下图所示,即可读取到一个图片到前面板:
图1 常规读取
图2 常规读取结果
当我们需要灰度图时,很简单,只需将Image type的参数设定为GrayScale(U8)即可。
补充一些概念:
每个像素的颜色用16位二进制数表示,叫做16位图;
每个像素存放在1个Byte中,0~255分别表示不同的灰度,0表示最暗,255最亮,叫做8位图。
灰度图的处理方法(图像点运算)
1. 灰度直方图
统计各像素的灰度值,然后在图中显示出各个灰度值的点数,横坐标为灰度值0~255,纵坐标为个灰度值对应的像素点数,一般用占的百分比表示。
这个算法在Labview的Vision的工具包中是IMAQ Histograph,其中参数 Image mask不输入的时候,表示的整个图。需要某个区域时,可选择IMAQ ROIToMask这个VI。灰度直方图可方便观察每个级别的灰度值有多少个像素点。
2. 线性变换
将灰度值统一的进行放大和缩小。即对每个点进行线性运算。在labview程序中,使用IMAQ ImageToArray获取灰度图的每个像素的灰度值,是一个2D数组,然后对数组进行运算,得到一组新的灰度值。设定Xi是原灰度图第i个点的灰度值,Yi是线性变换过得灰度值,有以下公式
Yi=Xi*k+b
然后将2D灰度值数组还原成图像,使用IMAQ ArrayToImage。输入参数中,根据原图的实际情况,选择是Image Pxies(U8)还是其他参数。
程序框图略。函数参见上文中提到的。
3. 灰度拉伸
灰度拉伸类似于线性变换,区别是映射关系是一个分段函数,类似于下图所示:
图3 灰度拉伸
对分段函数分别求出k和b,进行计算即可。算法程序框图可参见如下:
图4 算法
“拉伸设置”是一个XY图,计算三个段的k、b后,集散新的灰度值,还原图像。处理结果如如下:
图5 灰度拉伸结果
可以概括为,让浅色更浅,深色更深。
4. 灰度均衡
灰度均衡,顾名思义,就是让灰度尽量的分布均匀些,从直方图上直观的看,就是让灰度分布曲线平缓一些。算法如下:
Y=255*(n0+n1+n2+……+ni)/n,i∈[0,X];其中,X为待转换的像素值,n为总像素数,ni为灰度为i的像素个数。程序框图如下:
图6 均衡算法
5. 二值化
二值化是以某一个灰度值为阈值,小于阈值为0,大于阈值为255,由此设定,可将图像进行分割。
图7 二值化结果
二值化后,即可明显的分割图像。
未完待续。。。。。