【发布时间】:2014-02-07 16:58:46
【问题描述】:
我在 C++ 中使用一组 unsigned char 表示图像中的像素。每个像素有 3 个通道 (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];
}
但这出奇的慢。
谢谢!
【问题讨论】:
-
您是否检查过这个循环需要多长时间才能运行,不包括任何其他代码?它看起来不应该很慢。另外,您有什么理由必须拆分它们吗?如果您需要特定的颜色,为什么不直接循环并使用 pos
-
是的,它很慢。 3MP 图像大约需要 7 毫秒。我必须拆分它们才能调用另一个库。
-
嗯,7*10^-3 秒 * 2 GigaHertz(例如)获得 1400 万次操作。 1400 万次操作听起来适合 3MP 图像。至少是正确的数量级。虽然,这是一个非常粗略的估计,我在这方面没有太多经验,所以我可能完全错了,但感觉很合理。
-
也许有办法让它进入 SSE?移动字节似乎很慢。
-
二维目标数组是以通道为主的顺序设置的,因此单个像素的三个颜色分量在内存中以 srcWidth*srcHeight 字节分隔,这可能会降低缓存效率。试试 splitChannels[lotsa_pixels][3]。
标签: c++ image optimization image-processing