c++ - 在没有 OpenCV 的情况下从 C++ 中的 RGB 数组拆分 channel

标签 c++ image optimization image-processing

我在 C++ 中使用代表图像中像素的无符号字符数组。每个像素有 3 个 channel (R、G、B)。图像是线性表示的,有点像

RGBRGBRGBRGB......

如何有效地将每个 R、G 和 B 拆分为单独的数组?

我试过:

  for(int pos = 0; pos < srcWidth * srcHeight; pos++) {
      int rgbPos = pos * 3;
      splitChannels[0][pos] = rgbSrcData[rgbPos];
      splitChannels[1][pos] = rgbSrcData[rgbPos + 1];
      splitChannels[2][pos] = rgbSrcData[rgbPos + 2];
  }

但这出奇的慢。

谢谢!

最佳答案

我的尝试:四个字节四个字节地加载和存储。字节加扰会很乏味,但可能会提高吞吐量。

// Load 4 interleaved pixels
unsigned int RGB0= ((int*)rgbSrcData)[i];
unsigned int RGB1= ((int*)rgbSrcData)[i + 1];
unsigned int RGB2= ((int*)rgbSrcData)[i + 2];

// Rearrange and store 4 unpacked pixels
((int*)splitChannels[0])[j]= 
    (RGB0 & 0xFF) | (RGB0 >> 24) | (RGB1 & 0xFF0000) | ((RGB2 & 0xFF00) << 16);
((int*)splitChannels[1])[j]= 
    ((RGB0 & 0xFF00) >> 8) | (RGB1 & 0xFF) | (RGB1 >> 24) | (RGB2 & 0xFF0000) >> 16;
((int*)splitChannels[2])[j]= 
    ((RGB0 & 0xFF0000) >> 16) | (RGB1 & 0xFF00) | ((RGB2 & 0xFF) >> 16) | (RGB2 & 0xFF000000);

(注意:未选中!)也可以使用仅移位版本。

SSE 解决方案会更复杂(步长 3 与 2 的幂不相容)。

关于c++ - 在没有 OpenCV 的情况下从 C++ 中的 RGB 数组拆分 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21619609/

相关文章:

c++ - 最小正数的最简洁/最快算法

mysql - 性能优化 : Null allowed/not allowed vs Performance, 如果不是关键

c++ - 继承带有默认参数的构造函数: Which compiler is correct?

c++ - 如何将 CLion (1.2.4) 用于涉及 Qt Creator 的项目?

c++ - 解释此 C++ 函数中的程序流程

image - JavaFX 按钮背景图像

JavaScript 无法在 onclick 属性中找到函数

c++ - Lambda 函数 C++ : Does capturing the index of a loop make a difference?

wordpress - 如何显示wordpress ACF插件自定义图像字段图像

sql - 如何使用窗口函数优化 SQL 查询