我有一个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)
答案 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
现在,您可以在所有频道所需的点处对图像进行采样。