Create an image stack (3-D matrix)

306 views (last 30 days)
Jack on 4 Jun 2013
Commented: Tilkesh on 18 Feb 2022
Hello. I'm importing a series of images from my working directory using the following code:
for i=139:141
% {} = cell array
images{i} = imread(sprintf('IMG_%04d.JPG',i));
I{i} = rgb2gray(images{i});
I have a large number of images, but here I'm importing just a sample. I'm converting each color image to grayscale. I must also create an image stack, a 3D matrix of grayscale images. I've been browsing the web for an answer, but I'm having difficulty understanding the process. size(I) yields '1 141', and I'm wondering how I can create a 3-D matrix from this. Your help would be greatly appreciated. Thank you!
  1 Comment
joseph robinson
joseph robinson on 19 Apr 2017
Adding to the feedback of others, your code would be more efficient without looping, e.g.,
idx = 139:141;
# image file paths
ipaths =cellfun(@(x) sprintf('IMG_%04d.JPG',x),idx,'uni',false);
# read images into cell array
I = cellfun(@imread, ipaths,'uni',false);
# Convert to gray-scale
Igray = cellfun(@rgb2gray,I,'uni',false);
# Concatenate 3 gray-scale images into single 3D matrix
myImage = cat(3,Igray{:});
Hope this helps!

Sign in to comment.

Accepted Answer

Kye Taylor
Kye Taylor on 4 Jun 2013
Edited: Kye Taylor on 4 Jun 2013
Execute this command after your code above to get the three gray-scale images you create into one 3D matrix of grayscale images;
myImage = cat(3,I{139:141});

More Answers (4)

hf fh
hf fh on 21 May 2018
Please help me .. I searched a lot for convert 2Dimages into 3D but I still have the same problem !!! ''I can not get the images in volume in three dimensions" I have a search in 20 image dimensions [773x896]pixel, I want to convert it to 3D-three dimensions in volume form to study the depth, I following steps this: First:
Must be converted to a size of [300 * 300] pixels Second:
Converted to stack Third:
Converted to format==> 3D
like :
folder = '/Users/mac/Desktop/fiel2/data/';
for i=1:20
images{i} = imread( fullfile(folder, sprintf('%d.tif',i) ));
Q{i}=imresize(images{i} ,[300 , 300]);
I = cat(3, Q{i});
Thank you for help me ...
Tilkesh on 18 Feb 2022
Use Fiji or imagej it is free software. After spending many days I could not findout correct stacking solution in matlab.

Sign in to comment.

Image Analyst
Image Analyst on 4 Jun 2013
Edited: Image Analyst on 4 Jun 2013
The (badly-named) variable I is a one dimensional array of cells. Inside each cell it a 2D array. So, in effect, this is a 3D array though you can't reference it like I(row, column, slice). If that is what you need to do then you need to do
I = []; % Before the loop
Then in the loop:
I = cat(3, I, images{i}); % Tack on slice i into a new cell.
In the meantime, please read the FAQ on cells to get a better idea of how they work:
Image Analyst
Image Analyst on 31 Jul 2021
@Jay Kandukuri, allocate an array of 80 slices, then loop and read in the files and load them in to the array you just allocated.
dcm3d = zeros(rows, columns, 80, 'uint8');
% Then in a loop, load them in
for slice = 1 : 80
thisImage = dcmread(filename); % filename must change on every iteration obviously.
dcm3d(:, :, slice) = thisImage;

Sign in to comment.

hf fh
hf fh on 21 May 2018
Edited: Walter Roberson on 21 May 2018
I have a question
I used the same method but I want to extract it in size format volume like figure 3D
how it would be???
clear all
folder = '/Users/mac/Desktop/fiel2/data';
D = '/Users/mac/Desktop/fiel2/data';
for i=1:8
% {} = cell array
images{i} = imread(sprintf('%d.tif',i));
I{i} = rgb2gray(images{i});
I = cat(3, I, images{i}); % Tack on slice i into a new cell.
Image Analyst
Image Analyst on 15 Apr 2020
This works for me:
folder = pwd; % 'C:\Users\Suraj\Desktop\images\Results';
% for k = 109 : 433
% fullFileName = fullfile(folder, sprintf('000%d.jpg', k));
for k = 1 : 10
fullFileName = fullfile(folder, sprintf('%d.jpg', k));
if ~isfile(fullFileName)
fprintf('File #%d not found : %s\n', k, fullFileName);
fprintf('Storing image file #%d : %s\n', k, fullFileName);
% Store the original image, regardless of whether it's RGB or gray scale.
originalImages{k} = imread(fullFileName);
% Store the gray scale version of the image. Convert (if necessary) from RGB to gray scale.
if ndims(originalImages{k}) > 2
grayScaleImages{k} = rgb2gray(originalImages{k});
grayScaleImages{k} = originalImages{k};
Change the comments to have it use your images in your folder, and in the range 109 to 433. Better yet, see if you can just use dir() to get a list of only those images that definitely exist.

Sign in to comment.

hf fh
hf fh on 21 May 2018
Thank you for answering me... I'm a beginner in using MATLAB and I just want to convert 20 images from 2D-two to 3D-three dimensions only. The aim is to convert from 20 images to an only volume 3D Look for of a method to apply the images.
I following steps like this:
First: Must be converted to a size of [300 * 300] pixels
Second: Converted to stack==>2D[300*300*20]
Third: Converted to format==> 3D volume
please help me What do I think about is true ??? and if you have a proposal please help me ..
  1 Comment
r r
r r on 20 Nov 2021
I have 30 images-2D and I want to convert it into a package(stack) and then convert it to 3D-volume, I use several methods but didn't get any result please help me?!!
clear all
folder = '/Users/Desktop/Slice3D/';
for k=1:30
images{k} = imread( fullfile(folder, sprintf('%d.jpg',k) ));
Q{k}=imresize(images{k} );
I = cat(3, Q{k});
V =squeeze(I);
image3d = zeros(512,512, 30, 'uint8');
for k = 1 : 30
% Read one image.
thisImage = imread( fullfile(folder, sprintf('%d.jpg', k) ));
% Store this image in the k'th slice of the 3-D image array.
%image3d(:, :, k) =imresize(thisImage);
image4d(:, :, :, k) = imresize(thisImage);
I = cat(3,image3d(:, :, k));
M =squeeze(I);

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!