如何在 LABVIEW 中快速将 U32 图像阵列解压为 RBG U8 阵列

How to quickly unpack U32 Image Array into an RBG U8 Array in LABVIEW

我有一个扁平化 (1D) U32 编码图像数组,其中 r、b 和 b 8 位通道值编码到每个 U32 的前 24 位中。我想将此数组扩展为 U8 数组,每个数组存储一个单独的 r、g 或 b 值 (0-255)。问题是我需要这种情况发生得非常快(在旧计算机上每秒数百次),而我创建的方法很慢。

我是 labview 的新手,所以我不确定有什么更快的方法。

我已经通过创建一个 U8 数组、遍历 U32 图像数组的每个索引并使用 shift-register 将相应的 3 个 rgb 值分配给 U8 数组中的适当索引来成功完成此操作。我尝试使用 In Place Element Structure(这可能不需要像 shift 那样在循环之间复制数据),但我不知道如何让它在循环内工作以及当我尝试 return 最后一个数组时从循环中,只有最后一个元素被修改。

这是我上面描述的第一种工作方法:

在 c/c++ 中,它会非常简单(像这样):


uint8_t* convert_img(uint32_t img[640*480]){
  uint8_t *img_u8 = new uint8_t[640*480*3];
  for (int i=0; i<640*480; ++i){
    img_u8[i*3] = img[i] & 0xff; // r
    img_u8[i*3 + 1] = (img[i] >> 8) & 0xff; // g
    img_u8[i*3 + 2] = (img[i] >> 16) & 0xff; // b
  }
  return img_u8;
}

上面的工作 labview 示例仅以 20 Hz 运行!我认为对于这样一个简单的操作来说,这太慢了。有没有经验丰富的人建议我如何使用 labview 代码快速实现这一目标?

我会这样做: U32 至 U8

步骤是:

  • Flatten To String - endian 选择字节的顺序
  • 从字符串展开 - 变成一维 U8 数组
  • 抽取一维数组 - 创建 4 个一维数组
  • 重塑数组 - 变成 640x480 数组

应该足够快了。

我希望最快的选择是使用 Split Numbers 原语将 U32 分解为 U8,但您需要实际测试:

另请注意,测试性能并不像您想象的那么容易,但如果您查看总体速率,您可能对基本测试没问题。