工业相机使用过程记录
02-像素格式解析
通过将相机输出图像裸数据raw格式直接存图,并使用Notepad++中的HEX-Edit插件查看数据内容。
一、黑白/Mono
直接使用相机测试相机图像存图:
图像中各部分灰度分别为:0、36、73、109、146、182、219、255,以灰度73列为例
(1)Mono 8
该列图像数据为十六进制49,十进制为73,那么Mono 8就是每个像素点占8bit,依次排列。
(2)Mono 10
该列图像数据为十六进制2401,由于相机均为小端数据,实际数据应解析为0124,十进制为292=734,那么Mono 10格式为每个像素点占16bit,但是只有10bit为有效数据。
(3)Mono 10 Packed
Mono 10 Packed像素格式为了节省空间,将10bit数据存储在12bit的内存空间中,剩余2bit为0,那么每24bit数据中包含两个像素点的灰度信息,也就是说49 00 49中存在两个相同灰度像素点的信息,转换为二进制就是0100 1001 0000 00 004,与Mono 10格式的结果相同。
(4)Mono 12
Mono 12与Mono 10类似,12bit数据占据16bit空间,92 04解析为4 92,十进制为1170,1170/16=73。
(5)Mono 12 Packed
参考Mono 10 Packed的结果,Mono 12 Packed就应该解析成49 22 49,像素灰度应为492,十进制为1170,与Mono 12格式结果相同。
二、彩色
仍然使用相机测试图像进行存图:
以粉色条纹(R:255 G:0 B:255)为例:
(1)Bayer
Bayer格式为大多数彩色工业相机的源数据格式,其他像素格式一般为Bayer格式插值得到。
Bayer格式的存储方式与Mono格式基本一致,差别仅仅在于Mono格式每个像素点存储的是该像素点的灰度信息,而Bayer格式每个像素点存储的是该像素点的某一个分量(RGB)的值。
我使用的是Bayer GR,那么他的像素排布就是第一行GRGRGRGRGR…,第二行BGBGBGBG…,以此类推。
Bayer GR 8选取两行数据的连接位置:
第一行GR排列,符合0、255、0、255的规律
第二行BG排列,也符合255、0、255、0的规律
那么Bayer 10/Bayer 10 Packed/Bayer 12/Bayer 12 Packed同理,此处不再赘述。
(2)RGB 8/BGR 8
RGB和BGR格式是最容易理解的像素格式,每个像素点占据连续的24bit空间,其中R、G、B三个分量分别占有8bit,排列方式也非常简单:
RGB 8格式就是R1 G1 B1 R2 G2 B2…
那么BGR 8格式就是把RB两分量调换位置,即B1 G1 R1 B2 G2 R2…
(3)YUV
相机提供了YUV格式中的两种:YUV 422 Packed(实际排列方式为UYVY)、YUV 422 (YUYV) Packed(实际排列方式为YUYV)
此处以YUYV方式为例
像素排列方式为Y1 U1 Y2 V2 Y3 U3 Y4 V4…
每个像素点拥有一个Y分量,每两个像素点共用一个V分量,也就是说Y分量为68,十进制就是104;U分量为DE,十进制为222;V分量为EB,十进制为235。
随便找了个转换公式:
R= Y + ((360 * (V - 128))>>8) =254
G= Y - (( ( 88 * (U - 128) + 184 * (V - 128)) )>>8) =0
B= Y +((455 * (U - 128))>>8) =255
基本符合粉色条纹的RGB分量
实测发现UYVY的方式与YUYV方式仅仅是排列顺序不同,不再赘述。
PS:
Packed在彩色图像中一般表示为各分量交织存储的打包格式比如RGBRGBRGB,Planar一般为分量分别存储的平面格式RRRGGGBBB。
Packed在黑白图像中一般Packed表示节省空间的打包方式,比如12bit数据存储在16bit空间中,剩余的4bit由下一个像素点的4bit填充。