3

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

我是labview 的新手,所以我不确定有什么更快的方法来做到这一点。

我通过创建一个 U8 数组、迭代 U32 Image 数组的每个索引并使用移位寄存器将相应的 3 个 rgb 值分配给 U8 数组中的适当索引来成功地实现了这一点。我尝试使用 In Place Element Structure(这可能不需要像 shift 这样的循环之间复制数据),但我不知道如何让它在循环内工作,当我试图从循环中返回最后一个数组时,只有最后一个元素被修改。

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

Dropbox VI 图片链接(更新我现在有声望了)

在 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代码快速实现这一点?

4

2 回答 2

4

我会这样做:U32 到 U8

在此处输入图像描述

步骤是:

  • Flatten To String - endian 选择字节的顺序
  • Unflatten From String - 成一维 U8 数组
  • 抽取一维数组 - 创建 4 个一维数组
  • 重塑阵列 - 变成 640x480 阵列

应该足够快。

于 2019-08-24T23:40:24.160 回答
2

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

在此处输入图像描述

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

于 2019-08-25T06:52:03.623 回答