2016-03-14 6 views
2

У меня есть изображение канала, и у меня есть матрица точек размером 100x2 (в моем случае n равно 20, но, возможно, более понятно думать об этом как о 3-канальном изображении) , Мне нужно пробовать изображение в каждой точке и получить массив nx100 этих точек изображения. Я знаю, как сделать это с цикл:Пример 1D векторов из 3D-массива с использованием вектора точек

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 х 100 образцов 20 (по одному для каждой возможной комбинации х в X и Y в Y)

+0

Относительно двойного голосования: Я не вижу, как [этот вопрос] (http://stackoverflow.com/questions/35991879/extracting-a-list-of-values-from-an-array-faster) адреса хвост ':'. – Daniel

+0

@ Даниэль, согласен. Я отозвал голос, как только заметил эту мелочь. – Suever

ответ

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 

Теперь у вас есть изображение, отобранное в точках вы хотели для всех каналов.

+0

Последнее предложение неверно, изменение - операция с нулевой стоимостью, она не создает дополнительную копию данных. – Daniel

+0

@ Даниэль О, правда? Пока он не изменен, это нулевая стоимость? Ухельп узнал что-то сегодня! – Suever

+0

Да, (линеаризованные) данные в памяти одинаковы. – Daniel

Смежные вопросы