oma11
oma11

Reputation: 55

How do i store sequence of 2D matrices into a 3D array in Matlab?

I have these series of 2D CT images and i have been able to read them into Matlab using "imread". The issue however is that i need the image read-in as a single 3D matrix rather than stack of several 2D matrices. I have been made aware that it is possible to store the number of 2D layers as the 3rd dimension, but i have no idea how to do this as i am still a learner. The code i have for reading in the 2D stack are as follows:

a = dir('*.tif');                   

for i = 1: numel(a)
     b           = imread(a(i).name);    %read in the image              
     b_threshold = graythresh(b);        %apply threshold            
     b_binary    = im2bw(b, b_threshold);   %binarize image

     [m, n]      = size(b);              %compute the size of the matrix
     phi(i)      = ((m*n) - sum((b_binary(:))))/(m*n);   %compute the fraction of pore pixels in the image
     phi(:,i)    = phi(i);               %store each of the above result
end

I have added just a single image although several of these are needed. Nevertheless, one can easily duplicate the image to create a stack of 2D images. For the code to work, it is however important to rename them in a numerical order.pore_image Any help/suggestions/ideas is welcomed. Thanks!

Upvotes: 0

Views: 734

Answers (2)

Leos313
Leos313

Reputation: 5627

Well, the first advice is try to don't use the variable i and j in matlab because they are reserved (have a look here and here). After it depends on along which dimension you want to store the 2D images:

  1. if you want to store the images along the first dimension just use this code:

    a = dir('*.tif');                   
    
    for ii = 1: numel(a)
        b           = imread(a(ii).name);    %read in the image              
        b_threshold = graythresh(b);        %apply threshold            
        b_binary    = im2bw(b, b_threshold);   %binarize image
    
        [m, n]      = size(b);              %compute the size of the matrix
        phi(ii)      = ((m*n) - sum((b_binary(:))))/(m*n);   %compute the fraction of pore pixels in the image
        phi(:,ii)    = phi(ii);               %store each of the above result
        matrix_3D_images(ii,:,:)=b_binary;   %adding a new layer
    end
    

If you want to store the images along other dimensions it is easy to do: just change the posizion of the "pointer" ii:

  1. matrix_3D_images(:,ii,:)=b_binary; or
  2. matrix_3D_images(:,:,ii)=b_binary;

Upvotes: 0

Suever
Suever

Reputation: 65430

You can simply assign along the third dimension using i as your index

stack_of_images(:,:,i) = b_binary

Upvotes: 1

Related Questions