matlab 解码Keyence LJ-X8000位图高度图像

up9lanfz  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(321)

我有一台Keyence Line激光系统LJ-X 8000,我用它来扫描不同物体的表面。
控制器将高度信息保存为位图,每个像素表示一个高度值。经过多次修改,我发现Keyence并没有使用实际的颜色,而是使用24位RGB三元组作为某种形式的二进制存储。然而,这些字节的组合似乎都不适合我。24位整数有没有常用的存储方法?

zysjyyx4

zysjyyx41#

为了解码这些值,我对扫描仪的整个测量范围进行了扫描,包括开始和结束时的一些超出范围的值。如果你观察每个颜色平面的值的分布,你可以看到,第一个和第三个平面实际上只使用高达8/16的值,这意味着只有3/4位。这在图像本身中也是可见的,因为它主要显示绿色。
我得出结论,Keyence使用绿色平面的整个字节、第一个平面的3位和最后一个平面的4位来存储高度信息。Keyence似乎选择了某种奇怪的15位整数格式来存储他们的数据。
稍加调整,并知道扫描仪的有效范围是[-2.2,2.2],我就能够构建以下简单的小(MatLab-)脚本来计算每个像素的高度信息:

HeightValBin = bitshift(scanIm(:,:,2),7, 'uint16') ...
               + bitshift(scanIm(:,:,1),4, 'uint16')...
               + bitshift(scanIm(:,:,3),0, 'uint16');
scanBinValScaled = interp1([0,2^15], [-2.2, 2.2], double(scanBinVal));

Keyence提供了一款软件,可以将这些.bmp文件转换为.csv文件,但没有自动执行这一过程的API。由于我将不得不处理大量这样的文件,因此我需要自动执行此过程。
RGB三元组的计算值实际上比导出的CSV更精确,因为CSV仅在小数点后显示4位数字。

相关问题