SDG
SDG

Reputation: 2342

I need to create a 3D sphere from a bunch of 2D slices

I currently have to create a sphere from a stack of 2D slices (2D matrices in MATLAB, which represent 2D gray scale images). I have created a bunch of slices using the code below. To create the sphere I have repeatedly created slices of circles of increasing size till 100, and then of decreasing sizes. All of these slices are added to a 3D matrix.

Circle = ones(200,400,400); 

for i = 1:100
    [rr cc] = meshgrid(1:400);
    C = sqrt((rr-200).^2+(cc-200).^2)<=i;
    for j = 1:400
        for k = 1:400
            Circle(i,j,k) = C(j,k);
        end
    end
end

index = 100; 

for i = 1:100
    [rr cc] = meshgrid(1:400);
    C = sqrt((rr-200).^2+(cc-200).^2)<=index;
    for j = 1:400
        for k = 1:400
            Circle(i+100,j,k) = C(j,k);
        end
    end
    index = index - 1; 
end

viewer3d(Circle);

viewer3d is 3rd part library that helps you view your 3D image stacks of slices as 3d objects. Once I visualized this 'supposed' sphere, I realized that it is a diamond shape top and not a sphere.

Therefore I do not understand how to vary the size of circles till the center point of the sphere in the y plane and then decrease it with the same algorithm.

Thank you for your answers and please do not hesitate to ask me to clarify anything within this question.

Upvotes: 2

Views: 1284

Answers (2)

FiReTiTi
FiReTiTi

Reputation: 5898

Yes, the radius along the Z axis is not linear but varies with cos/sin function. Using this representation:

http://www.derivations.org/sphere.png

your radius is "Radius = r sin(Theta)", with "Theta = arccos(r / z)". So "r" is the radius of your sphere, and "z" the level/slice you want to draw in. Don't forget to that "z" goes from -"r" to "r". I've tested the formulae and it works fine for an image stack (slices).

Upvotes: 1

Ander Biguri
Ander Biguri

Reputation: 35525

Alternatively, create a sphere directly, without using loops:

Circle = zeros(200,400,400); 

[x,y,z]=meshgrid(1:size(Circle,1),1:size(Circle,2),1:size(Circle,3));

radius=??; %// e.g. radius=100;
%//this sphere is centered in the middle of the image
Circle(sqrt((x-size(Circle,1)/2).^2+(y-size(Circle,2)/2).^2..
     +(z-size(Circle,2)/2).^2)<radius)=1;

Upvotes: 3

Related Questions