我正在处理成堆的显微镜图像。通过堆栈我的意思是一对一个在另一个上面获得的图像,如这个非常自制的图表所示:(对不起质量)其中:
H =图像高度(以像素为单位)
W =图像宽度(以像素为单位)
Z =堆栈中的切片数量(即图像数量)。
我想要做的就是测量每一个高度'在堆栈中的位置,正交的" 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)
这对我来说基本上看起来像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
为最终输出。