原文:
//通道
for(k = 0; k < c; ++k){
//高
for(j = 0; j < h; ++j){
//宽
for(i = 0; i < w; ++i){
int dst_index = i + w*j + w*h*k;
int src_index = k + c*i + c*w*j;
im.data[dst_index] = (float)data[src_index]/255.;
}
}
}
图解:
如果用更多的语言描述上面转换的功能,发现比较繁琐,最终决定直接举例上图。
为了简化问题,假设如下:
- c = 3, w = 6, h = 5;
- 为了更直观观察结果,本次转换只是简单的迁移,期间没有经过数据的处理(im.data[dst_index] = data[src_index]);
//原始数据存放顺序:
int data[3][5][6]=
{
{
{110,111,112,113,114,115},
{120,121,122,123,124,125},
{130,131,132,133,134,135},
{140,141,142,143,144,145},
{150,151,152,153,154,155}
},
{
{210,211,212,213,214,215},
{220,221,222,223,224,225},
{230,231,232,233,234,235},
{240,241,242,243,244,245},
{250,251,252,253,254,255}
},
{
{310,311,312,313,314,315},
{320,321,322,323,324,325},
{330,331,332,333,334,335},
{340,341,342,343,344,345},
{350,351,352,353,354,355}
}
};
根据上面的功能进行转换之后目标数据 im.data 的效果为:
通过对比你会发现,源数据是按照不同通道的同一宽高像素数据放在了一块,而目标数据是按同一通道的不同宽高像素数据存放。