使用点矢量从3D阵列采样1D矢量

时间:2016-03-14 21:47:59

标签: matlab indexing

我有一个n通道图像,我有一个100x2点的矩阵(在我的情况下,n是20,但也许更清楚地认为这是一个3通道图像)。我需要在每个点对图像进行采样,并获得这些图像点的nx100阵列。 我知道如何使用for循环执行此操作:

for j = 1:100
        samples(j,:) = image(points(j,1),points(j,2),:);
end

我如何对此进行矢量化?我试过了

samples = image(points);

但是这给出了200个20通道的样本。如果我尝试

samples = image(points,:);

这给了我200个4800个通道的样本。甚至

samples = image(points(:,1),points(:,2));

给我100 x 100个样本20(每个可能的x组合x和Y组合y)

1 个答案:

答案 0 :(得分:2)

这样做的简洁方法是重塑图像,以便强制[nRows, nCols, nChannels]的图像为[nRows*nCols, nChannels]。然后,您可以将points数组转换为线性索引(使用sub2ind),这将对应于新的“组合”行索引。然后要抓取所有通道,您只需使用冒号运算符(:)作为第二维,现在代表通道。

% Determine the new row index that will correspond to each point after we reshape it
sz = size(image);
inds = sub2ind(sz([1, 2]), points(:,2), points(:,1));

% Do the reshaping (i.e. flatten the first two dimensions)
reshaped_image = reshape(image, [], size(image, 3));

% Grab the pixels (rows) that we care about for all channels
newimage = reshaped_image(inds, :);

size(newimage)

    100    20

现在,您可以在所有频道所需的点处对图像进行采样。