如何将 Argb32 加载到特征矩阵中以获得最佳性能?
Posted
技术标签:
【中文标题】如何将 Argb32 加载到特征矩阵中以获得最佳性能?【英文标题】:How to load Argb32 into Eigen Matrix for best performance? 【发布时间】:2013-01-27 13:21:11 【问题描述】:给定一个 Int 数组,一个 Argb32 图像,我如何才能以最佳方式将其加载到 Eigen Matrixes 中?
目标是创建一个小型图像处理库。作为第一部分,我想从 RGB 转换为灰度。
有没有什么方法可以在不复制任何内存的情况下将 int[] 加载到 3 个特征矩阵中?
(当提到特征时,它是线性代数库)。
【问题讨论】:
【参考方案1】:是的,使用带有适当内跨步的 Map 类,例如:
unsigned char* data = ...;
int w, h; // the width and height
typedef Map<Matrix<unsigned char,Dynamic,Dynamic>, 0, InnerStride<4> > Slide;
Slice red(data, w, h), green(data+1, w, h), blue(data+2, w, h);
然后你就可以开始玩它们了,例如,构造一个灰度浮点版本:
MatrixXf gray = (red.cast<float>() * 11 + green.cast<float>() * 16 + blue.cast<float>() * 5)/(32.*255.);
【讨论】:
不错。您能否添加有关切片类型 Map 的评论,它是否像矩阵一样工作。我可以做红+蓝+绿吗?还是需要先将其转换为浮点数。否则我会去 eigen doc 自己找到它:) 是的,你可以添加红色+绿色+蓝色,但是使用 unsigned char 你会溢出。不过,您可以转换为 (unsigned) int 。您甚至可以将演员表隐藏到 Slice 类型中。以上是关于如何将 Argb32 加载到特征矩阵中以获得最佳性能?的主要内容,如果未能解决你的问题,请参考以下文章
NEON:如何将 128 位 ARGB 转换为具有饱和度的 32 位 ARGB?
用于灰度到 ARGB 转换的 C++ SSE2 或 AVX2 内在函数