Vectorize在Matlab中切断了图像堆栈的视图

时间:2014-09-03 18:14:48

标签: image matlab vectorization cell-array

我正在处理成堆的显微镜图像。通过堆栈我的意思是一对一个在另一个上面获得的图像,如这个非常自制的图表所示:(对不起质量)其中:

H =图像高度(以像素为单位)

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

代码工作正常,但我必须遍历每个"高度单位"的整个切片,这根本不是最佳的。

我的问题是:为了提高速度,以前的代码如何进行矢量化,因为我最终会使用相当大的数据集。我想我的大脑已冻结,不知道如何有效地做到这一点。

1 个答案:

答案 0 :(得分: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表示使用的渠道数,问题情况为3DPrjMatWZ为最终输出。