2014-09-03 11 views
2

Я работаю со стопами изображений микроскопии. По стека То есть пара изображений приобрели один поверх другого, как показано на этой самой самодельного схеме: (извините за качество), где:Векторизовать отрезанный вид стека изображений в Matlab

Н = высота изображения в пикселях

W = Ширина изображения в пикселях

Z = количество фрагментов в стеке (т.е. количество изображений).

enter image description here

То, что я хочу сделать, это мера, для каждой позиции «высоты» в стеке, ортогональной «вид WZ», т.е. отрезан вид вдоль прямоугольника, такие как красный один на изображении , Сейчас у меня есть следующий код, который хорошо работает:

DummyProjMatrixYZ = zeros(SliceNumber,ImageWidth,ImageHeight,3,'uint16'); 

for h = ImageHeight:-1:1 
    for z = 1:SliceNumber 

     DummyProjMatrixWZ(z,:,h,:) = MovieCell{z}(h,:,:); % MovieCell is a cell array containing the individual frames (i.e. slices in the stack) of dimensions (Height,Width,3). 
    end  
end 

код работает отлично, но я должен перебрать целые кусочки для каждого «высота блока», который не является оптимальным при всех.

Мой вопрос: Как можно было бы векторизовать предыдущий код, чтобы получить скорость, так как в конечном итоге я буду работать с довольно большими наборами данных. Наверное, у меня есть замораживание мозга и я не знаю, как это сделать эффективно.

+0

1) Какой размер MovieCell? , 2) почему он находится в массиве ячеек, а не в 4D-матрице? – bla

+0

@ natan 1) MovieCell имеет размер (1, z), где z - это число ломтиков, то есть от 20 до 200 нормально. 2) Это в массиве ячеек, потому что это было намного проще для предыдущих манипуляций, которые я имел в виду с изображениями в нем. Но я согласен с тем, что имеет смысл хранить изображения в 4D-матрице. –

+0

, если его просто z всего лишь 20-200, почему бы не остаться с петлей? сколько времени вы бы спасли? – bla

ответ

1

Это в основном выглядело как indexing problem для меня. Смотрите, если это работает для вас -

%// Get all of the data into SliceNumber*ImageWidth x ImageWidth x 3 numeric 
%// array. No more messing around with cell arrays is needed after this point. 
A = vertcat(MovieCell{:}); 

%// Cocatenate data along dim3 to create a 2D array 
A1 = reshape(permute(A,[1 3 2]),size(A,1)*size(A,3),[]); 

%// Cut A1 after every ImageHeight rows to form a 3D array 
A2 = permute(reshape(A1,ImageHeight,size(A1,1)/ImageHeight,[]),[1 3 2]); 

%// Cut A2's dim3 into SliceNumber x 3 to create a 4D array 
A3 = reshape(A2,ImageHeight,ImageWidth,SliceNumber,3); 

%// Change the dimensions to match with original DummyProjMatrixWZ's 
DummyProjMatrixWZ = permute(A3,[3 2 1 4]); 

Сокращенный вариант -

%// Get all of the data into SliceNumber*ImageWidth x ImageWidth x Ch numeric 
%// array. No more messing around with cell arrays is needed after this point. 
A = vertcat(MovieCell{:}); 

%// Cut A at every H rows and resize to H x W x Slice*Ch to form a 3D array 
A2 = permute(reshape(permute(A,[1 3 2]),ImageHeight,[],ImageWidth),[1 3 2]); 

%// Cut A2's dim3 into Slice x Ch to create a 4D array and rearrange dims 
DPrjMatWZ = permute(reshape(A2,ImageHeight,ImageWidth,SliceNumber,[]),[3 2 1 4]); 

Здесь Ch обозначает число каналов, которое 3 в случае проблем и DPrjMatWZ является окончательным вывод.

+0

Да, это прекрасно работает, и время вычислений для моего 220 изображений было сокращено вдвое, поэтому преимущество для больших наборов данных будет очень важным, благодаря этому это потрясающе! –

+0

@ Benoit_11 Очень kool! Хорошо видеть преимущества на самом деле! :) Вы можете попытаться объединить последние две строки в одну и посмотреть, улучшится ли она дальше. – Divakar

+0

Да, конечно. Должен признаться, что я надеялся, что вы взглянете на мой вопрос и предложите волшебство векторизации. –

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