The emergence of phase contrast with sample-detector distance

Matlab code 

% Movie cartoon of a phase-contrast tomography experiment

 

clear all; close all

vid = VideoWriter('phaseTomoExpt.mp4','MPEG-4');

vid.Quality = 100;

vid.FrameRate = 30;

open(vid);

figure('units','pixels','position',[0 0 1920 1080],'ToolBar','none');

set(0,'defaultfigurecolor',[1 1 1]);

 

% Read movie file

vid2 = VideoReader('Edge_enhancement_with_distance_ZF_1080p.mov');

frames = read(vid2,[1 Inf]);

 

camSize = 2;

 

% Set up head and tail parts of zebrafish body as half ellipsoids

[x,y,z] = sphere(270);

x(z<0) = NaN ; y(z<0) = NaN ; z(z<0) = NaN;

 

% Set up middle part of zebrafish body as modulated cylinder

t = 0:pi/80:pi/2;

r = 0.2+0.8*(sin(t)).^2;

[a,b,c] = cylinder(r,100);

 

% Set up eyes and otoliths

[x2,y2,z2] = sphere(200);

 

% Set up backbone of zebrafish as modulated cylinder

t2 = 0:pi/80:4*pi;

r2 = 0.2+0.8*(sin(2*t2)).^6;

[a2,b2,c2] = cylinder(r2,100);

 

% Set up mirror faces

xm1 = [0 0 0 0 0];

ym1 = [-1 1 1 -1 -1];

zm1 = [-1 -1 1 1 -1];

 

 

myBlue = [0.4 0.44 0.73];

skin = [0.945 0.761 0.49];

lp = [-2 -1 1];

view(-34,5);

set(gca, 'Projection','perspective');

 

% Set up spherical bowl for lens surfaces

[X,Y,Z] = sphere(250);

X(Z>-0.8) = NaN ; Y(Z>-0.8) = NaN ; Z(Z>-0.8) = NaN;

rL = 1.2;

pos1 = [0.02 0.15 0.75 0.7];

pos2 = [0.8 0.2 0.19 0.6];

 

% Apply the transform

for ZZ = 0:610 % 150 frames, double the number of projections

    hold off

    subplot('position',pos1);

    newplot

    set(gca, 'Projection','perspective');

    % Draw zebrafish embryo

    surf(a/8,b/4,c-1,'EdgeColor','none','FaceColor',[0.5 0.5 0.5],...

        'FaceLighting','gouraud','DiffuseStrength',1,'FaceAlpha',0.4); % body part 1

    hold on

    surf(x/8,y/4,z*0.5,'EdgeColor','none','FaceColor',[0.5 0.5 0.5],...

        'FaceLighting','gouraud','DiffuseStrength',1,'FaceAlpha',0.4); % body part 2

    surf(x/40,y/20,-z*0.5-1,'EdgeColor','none','FaceColor',[0.5 0.5 0.5],...

        'FaceLighting','gouraud','DiffuseStrength',1,'FaceAlpha',0.4); % body part 3

    % Eyes

    surf(x2/10,y2/14+0.14,z2/7+0.25,'EdgeColor','none','FaceColor',[0.5 0.5 0.5],...

        'FaceLighting','gouraud','DiffuseStrength',1,'FaceAlpha',0.25);

    surf(x2/10,y2/14-0.14,z2/7+0.25,'EdgeColor','none','FaceColor',[0.5 0.5 0.5],...

        'FaceLighting','gouraud','DiffuseStrength',1,'FaceAlpha',0.25);

    surf(x2/25,y2/25+0.19,z2/25+0.25,'EdgeColor','none','FaceColor',[0.5 0.5 0.5],...

        'FaceLighting','gouraud','DiffuseStrength',1,'FaceAlpha',0.4);

    surf(x2/25,y2/25-0.19,z2/25+0.25,'EdgeColor','none','FaceColor',[0.5 0.5 0.5],...

        'FaceLighting','gouraud','DiffuseStrength',1,'FaceAlpha',0.4);

    % Otoliths

    s = surf(x2/35,y2/35-0.2,z2/25-0.05,'EdgeColor','none','FaceColor',[0.2 0.2 0.2],...

        'FaceLighting','gouraud','DiffuseStrength',1,'FaceAlpha',0.88);

    rotate(s,[1 0 0],29,[0,0,0]);

    s = surf(x2/35,y2/35+0.2,z2/25-0.05,'EdgeColor','none','FaceColor',[0.2 0.2 0.2],...

        'FaceLighting','gouraud','DiffuseStrength',1,'FaceAlpha',0.88);

    rotate(s,[1 0 0],-29,[0,0,0]);

    % Backbone

    s = surf(a2/35,b2/35,c2-0.7,'EdgeColor','none','FaceColor',[0.5 0.5 0.5],...

        'FaceLighting','gouraud','DiffuseStrength',1,'FaceAlpha',0.4);

    

    axis off

    axis equal

    xlim([-4.05 7.1]);

    ylim([-1.5 1.5]);

    zlim([-1.5 4.1]);

    light('Position',lp,'Style','infinite');

    

    % Incident x-rays denoted by arrow

    mArrow4([-4 0 0],[-1.4 0 0],'color','y','stemWidth',0.4,...

        'tipWidth',0.61,'facealpha',0.7);

    

    % Scintillator screen

    scTh = 0.1;

    scWi= 1.5;

    scHe= 1.5;

    scPos = 0.14+ZZ/305;

    plotcube([scTh scWi scHe],[scPos -scWi/2 -scHe/2],0.5,'g',0);

    

    view(-34,5);

    

    % Lens

    % 1st convex surface

    lens1 = surf(2*X+2+ZZ/305,2*Y,2*Z+1.6,'FaceColor',myBlue,'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1);%,'FaceAlpha',0.35) ;

    alpha(lens1,0.5);

    rotate(lens1,[0 1 0],90,[2+ZZ/305,0,0]);

    % 2nd convex surface

    lens2 = surf(2*X+2.1+ZZ/305,2*Y,2*Z+1.6,'FaceColor',myBlue,'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1);%,'FaceAlpha',0.35) ;

    alpha(lens2,0.5);

    rotate(lens2,[0 1 0],-90,[2.1+ZZ/305,0,0]);

    % Outer rim of lens

    [lx, ly, lz] = cylinder(rL,100);

    camAp = surf(lx+2+ZZ/305,ly,lz/10,'FaceColor',myBlue,...

        'FaceLighting','gouraud','DiffuseStrength',1,'LineStyle','none');

    alpha(camAp,0.5);

    rotate(camAp,[0 1 0],90,[2+ZZ/305,0,0]);

    

    % 45-degree reflecting mirror

    mface1 = fill3(xm1+4+ZZ/305,ym1,zm1,[0.5 0.5 0.5],'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1,'SpecularStrength',1);

    rotate(mface1,[0 1 0],45,[4+ZZ/305,0,0]);

    mface2 = fill3(xm1+4.1+ZZ/305,ym1,zm1-0.1,[0.5 0.5 0.5],'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1,'SpecularStrength',1);

    rotate(mface2,[0 1 0],45,[4.1+ZZ/305,0,-0.1]);

    mface3 = fill3(ym1*0.05*1.4142+0.05*1.4142+4+ZZ/305,xm1-1,zm1,...

        [0.5 0.5 0.5],'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1,'SpecularStrength',1);

    rotate(mface3,[0 1 0],45,[4+ZZ/305,-1,0]);

    mface4 = fill3(xm1+4+ZZ/305-1/sqrt(2),ym1,...

        zm1*0.05*sqrt(2)-1/sqrt(2)-0.1/sqrt(2),[0.5 0.5 0.5],'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1,'SpecularStrength',1);

    rotate(mface4,[0 1 0],-45,[4+ZZ/305-1/sqrt(2),0,-1/sqrt(2)]);

    

    % Dot-dashed lines

    plot3([-2 4+ZZ/305],[0 0],[0 0],'k','LineStyle','-.','LineWidth',1.6);

    plot3([4+ZZ/305 4+ZZ/305],[0 0],[0 2],'k','LineStyle','-.','LineWidth',1.6);

    

    % Camera body

    % Main body

    plotcube([camSize camSize camSize],[4+ZZ/305-camSize/2 -camSize/2 2],...

        1,[0.2 0.2 0.2],0);

    % Screw ring thread outer surface

    rCamAp = 0.9*camSize/2;

    [cx, cy, cz] = cylinder(rCamAp,100);

    camAp = surf(cx+4+ZZ/305,cy,cz*camSize/16+2-camSize/16,'FaceColor',...

        [0.5 0.5 0.5],'LineStyle','none',...

        'FaceLighting','gouraud','DiffuseStrength',1);

    hold off

    

    subplot('position',pos2);

    imshow(frames(:,:,1:3,ZZ+1))

    

    frame = getframe(gcf);

    writeVideo(vid,frame);

    

    hold off

end

% Output the movie as an mpg file

close(vid);