说我有2D线性指标:
linInd = sub2ind(imSize,rowPnts,colPnts);
我有一个3D彩色图像I:
I = rand(64,64,3)*255
为了获得2D平面中的所有坐标但是对于图像的每个通道,我有什么方法可以索引这样的东西吗?也就是说,我可以使用为2D指定的线性指标通过一个命令获取每个像素的所有颜色通道信息吗?
I(linInd,:)
所以我不必将图像分成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)
。