EDIT:99% 的 C 库将以行优先存储图像,这意味着如果您从 Turbojpeg 获得 3 x WH(二维数组),您可以将其视为 3 x W x H(上面的预期输入)。在此表示中,像素先横向读取,然后向下读取。您需要它们在 MATLAB 中向下阅读。您还需要将像素顺序 (RGBRGBRGB...) 转换为平面顺序 (RRRR....GGGGG....BBBBB...)。解决办法是permute(reshape(I,3,W,H),[3 2 1])
.
这是 MATLAB 的情况之一permute http://www.mathworks.com/help/matlab/ref/permute.html命令可能会比您在短时间内手动编写的任何代码都要快(比所示的循环至少快 50%)。我通常会避开以下解决方案mexCallMATLAB http://www.mathworks.com/help/matlab/apiref/mexcallmatlab.html,但我认为这可能是一个例外。然而,输入是一个mxArray
,这可能会带来不便。无论如何,这是如何做的permute(I,[3 2 1])
:
#include "mex.h"
int computePixelCtoPlanarMATLAB(mxArray*& imgPermuted, const mxArray* img)
{
mxArray *permuteRHSArgs[2];
// img must be row-major (across first), pixel order (RGBRGBRGB...)
permuteRHSArgs[0] = const_cast<mxArray*>(img);
permuteRHSArgs[1] = mxCreateDoubleMatrix(1,3,mxREAL);
// output is col-major, planar order (rows x cols x 3)
double *p = mxGetPr(permuteRHSArgs[1]);
p[0] = 3;
p[1] = 2;
p[2] = 1;
return mexCallMATLAB(1, &imgPermuted, 2, permuteRHSArgs, "permute");
}
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) {
// do some argument checking first (not shown)
// ...
computePixelCtoPlanarMATLAB(plhs[0], prhs[0]);
}
Or call permute(I,[3 2 1])
回到 MATLAB 中。
关于reshape
首先从 3xWH 变为 3xWxH?只要告诉代码,它真的是 3xWxH!reshape
不移动任何数据-- 它只是告诉 MATLAB 将给定的数据缓冲区视为特定大小。