Matlab使用线性指标对两个维度进行索引,同时保持第三维度不变

时间:2015-12-23 22:44:02

标签: image matlab matrix indexing

说我有2D线性指标:

linInd = sub2ind(imSize,rowPnts,colPnts);

我有一个3D彩色图像I:

I = rand(64,64,3)*255

为了获得2D平面中的所有坐标但是对于图像的每个通道,我有什么方法可以索引这样的东西吗?也就是说,我可以使用为2D指定的线性指标通过一个命令获取每个像素的所有颜色通道信息吗?

I(linInd,:)

所以我不必将图像分成3个部分再重新组装?

感谢。

3 个答案:

答案 0 :(得分:4)

您可以使用broadcast 2D 3D线性索引到[m,n,r] = size(I); out = I(bsxfun(@plus,linInd,(m*n*(0:r-1))')) 案例而不会弄乱输入数组,就像这样 -

%// ---------------- 2D Case ---------------------
im = randi(9,10,10);
imSize = size(im);

rowPnts = [3,6,8,4];
colPnts = [6,3,8,5];
linInd = sub2ind(imSize,rowPnts,colPnts);

%// ---------------- 3D Case ---------------------
I = randi(9,10,10,4);

%// BSXFUN solution
[m,n,r] = size(I);
out = I(bsxfun(@plus,linInd,(m*n*(0:r-1))')); %//'

%// Tedious work of splitting
Ir = I(:,:,1);
Ig = I(:,:,2);
Ib = I(:,:,3);
Ia = I(:,:,4);

示例设置

>> Ir(linInd)
ans =
     8     9     1     6
>> Ig(linInd)
ans =
     1     5     9     8
>> Ib(linInd)
ans =
     8     5     3     8
>> Ia(linInd)
ans =
     8     8     3     3
>> out
out =
     8     9     1     6
     1     5     9     8
     8     5     3     8
     8     8     3     3

<强>输出

{{1}}

答案 1 :(得分:2)

据我所知,首先重塑矩阵是以这种方式使用线性索引的唯一方法。

I2=reshape(I,[],3)
I2(ind,:)

答案 2 :(得分:2)

您是否特别需要将该维度保持为第三个?如果没有,您可以permute数组将该维度移至第1个位置,然后使用arr(i3d, linInd)