Contents
Area 2D
back to topfunction[Area] = area_2D(polys,X)
A = zeros(size(polys,1),1); %preallocate matrix for k = 1:size(polys,1) polytemp = polys(k,:); %extract a single triangle and assign to temp variable a = polytemp(1); %get coordinates for 1 of 3 triangle a = X(a,:); b = polytemp(2); %get coordinates for 1 of 3 triangle b = X(b,:); c = polytemp(3); %get coordinates for 1 of 3 triangle c = X(c,:); A(k) = 1/2 * abs( det( [ 1 1 1; b-a; c-a ]) ); %compute area of one triangle end Area = sum(A); %sum all areasLoad Image Data
back to topfunction[] = loadmyimages()
mycd = cd; %get current path mydir = dir([mycd,'/images']); %create variable for directory to images folder icount = 1; %initialize counter for k = 1:length(mydir); tempname = lower(mydir(k).name); if ~isempty(strfind(tempname,'.tif')) %create a name for all files with tif extension Itemp = imread(mydir(k).name); %get images if size(Itemp,3) == 3 I(:,:,icount) = rgb2gray(Itemp); %store first channel of image into variable else I(:,:,icount) = Itemp; end icount = icount + 1; %increment matrix I index elseif ~isempty(strfind(tempname,'.lsm')) myLSM = mydir(k).name; %store the .lsm file name else continue; %do not increment matrix I index end end Myfile = mydir(k).name; assignin('base','Myfile',Myfile); %check for image type .tiff or .lsm %if .tiff, will need to manually or extrack microscope settings %if .lsm can extract microscope settings if exist('I','var') && ~isempty(I) MyI = I; %use MyI as active data set assignin('base','MyI',MyI); assignin('base','I',I); %get pixel dimension of cube volume assignin('base','DimensionX',size(I(:,:,1),1)); assignin('base','DimensionY',size(I(:,:,1),2)); assignin('base','DimensionZ',size(I(:,:,1),3)); %get unit length dimensions of cube volume tempfile = lower(mydir(k).name); [Imag Izoom] = strtok(lower(tempfile),'x'); Imag = Imag(end-1:end); %objective lense magnitude for k = 1:length(Izoom) if ~isnan(str2double(Izoom(k))) Izoom = Izoom(k); %zoom break end end if str2double(Imag) == 63 && str2double(Izoom) == 5 %FIX %FIX VoxelSizeX = 3.9000e-08;%lense = 63x, zoom = 5 VoxelSizeY = 3.9000e-08; VoxelSizeZ = 5.0000e-07; elseif str2double(Imag) == 63 && str2double(Izoom) == 4 VoxelSizeX = 6.9754e-08;%lense = 63x, zoom = 4 VoxelSizeY = 6.9754e-08; VoxelSizeZ = 5.0000e-07; elseif str2double(Imag) == 63 && str2double(Izoom) == 3 VoxelSizeX = 9.3006e-08;%lense = 63x, zoom = 3 VoxelSizeY = 9.3006e-08; VoxelSizeZ = 5.0000e-07; elseif str2double(Imag) == 63 && str2double(Izoom) == 2 %FIX %FIX %lense = 63x, zoom = 2 else %set to lense = 63x && zoom = 4 end assignin('base','VoxelSizeX',VoxelSizeX); assignin('base','VoxelSizeY',VoxelSizeY); assignin('base','VoxelSizeZ',VoxelSizeZ); elseif exist('myLSM','var') && ~isempty(myLSM) f = fullfile([cd,'\images\',myLSM]); myStack = tiffread32(f); for k = 1:length(myStack) I(:,:,k) = myStack(k).data{1}; end MyI = I; %use MyI as active data set assignin('base','MyI',MyI); assignin('base','I',I); %get pixel dimension of cube volume assignin('base','DimensionX',myStack(1,1).lsm.DimensionX); assignin('base','DimensionY',myStack(1,1).lsm.DimensionY); assignin('base','DimensionZ',myStack(1,1).lsm.DimensionZ); %get unit length dimension of cube volume assignin('base','VoxelSizeX',myStack(1,1).lsm.VoxelSizeX); assignin('base','VoxelSizeY',myStack(1,1).lsm.VoxelSizeY); assignin('base','VoxelSizeZ',myStack(1,1).lsm.VoxelSizeZ); else disp('No Images (.tiff) or (.lsm) found in images folder'); %if no files found notify user endfunction[MyIfilt] = myfilter(myImages)
Filters
back to top%Pass the images to the GUI, filter and draw %MyI = evalin('base','MyI'); MyI = myImages; I = double(MyI(:,:,1)); %set up Gaussian filter works for square images sizeU = length(I)/8; u = -sizeU/2+1:sizeU/2; v = u; sigma = .6; clear Hgauss; for n = 1:size(u,2) for m = 1:size(v,2) Hgauss(n,m) = exp(-2*(pi*sigma)^2*((u(m)/sizeU)^2+(v(n)/sizeU)^2)); end end %set up frequency template H_LP = zeros(size(I,1),size(I,2)); %make filter to size of image xstart = size(H_LP,1)/2 - sizeU/2 + 1; %correct for inclusive incrementation xend = size(H_LP,1)/2 + sizeU/2; ystart = size(H_LP,2)/2 - sizeU/2 + 1; yend = size(H_LP,2)/2 + sizeU/2; H_LP(xstart:xend,ystart:yend) = Hgauss; MyIfilt = double(MyI); for k = 1:size(MyI,3) J = fft2(MyI(:,:,k)); %make temp image Jshift = fftshift(J); %get frequency image %Apply Filter to freqency space of image Jshift_H_LP = Jshift.*H_LP; J_H_LP = fftshift(Jshift_H_LP); I_H_LP = ifft2(J_H_LP,'symmetric');%need to use symmetric inverseve due to roundoff errors %scale I tempI = double(I_H_LP); A = min(tempI(:)); B = max(tempI(:)); tempI = 255*( (tempI-A) / (B-A) ); %scale 0-255 MyIfilt(:,:,k) = tempI; %reassign working I end h = [ 0 0 0 1 0;... %filter 0 1 0 1 0;... 0 -2 0 2 0;... 0 1 0 1 0;... 0 0 0 1 0]; hup = h'; %rotate filter -90 %Process all Images in this loop disp('Filtering Images...'); for n = 1:size(MyIfilt,3) I = MyIfilt(:,:,n); Ifliplr = fliplr(I); Iflipud = flipud(I); %Filter Left & Right PrewitHl = (imfilter(I,h,'replicate')); %left to rigth filter PrewitHr = (imfilter(Ifliplr,h,'replicate')); %right to left filter flipped PrewitHr = fliplr(PrewitHr); %right to left filter reoriented %Filter Top and Bottom PrewitVu = (imfilter(I,hup,'replicate')); %up down filter PrewitVd = (imfilter(Iflipud,hup,'replicate')); %down up filter flipped PrewitVd = flipud(PrewitVd); %down up filter reoriented %oragnize data into structure Prewitcellmat = {PrewitHl PrewitHr PrewitVu PrewitVd}; %make cell of all Prewit matrices Prewitcellstr = {'PrewitHl' 'PrewitHr' 'PrewitVu' 'PrewitVd'}; %make cell of all Prewit matrices Prewitstruct = struct('name', Prewitcellstr, 'data', Prewitcellmat); %make structure %scale data for k = 1:length(Prewitstruct); %iterate through the structure and scale data A = min(Prewitstruct(k).data(:)); B = max(Prewitstruct(k).data(:)); Prewitstruct(k).data = 255*((Prewitstruct(k).data)-A)/(B-A); %scale 0-255 eval([Prewitstruct(k).name ' = Prewitstruct(k).data;']); %reassign scaled values end %multiply the horizontal and vertical filter results PrewitHmul = PrewitHl.*PrewitHr; PrewitVmul = PrewitVu.*PrewitVd; %oragnize data into structure Prewitmulcellmat = {PrewitHmul PrewitVmul}; Prewitmulcellstr = {'PrewitHmul' 'PrewitVmul'}; Prewitmulstruct = struct('name', Prewitmulcellstr, 'data', Prewitmulcellmat); %scale data for k = 1:length(Prewitmulstruct); %iterate through the structure and scale data A = min(Prewitmulstruct(k).data(:)); B = max(Prewitmulstruct(k).data(:)); Prewitmulstruct(k).data = 255*((Prewitmulstruct(k).data)-A)/(B-A); %scale 0-255 eval([Prewitmulstruct(k).name ' = Prewitmulstruct(k).data;']); %reassign scaled values end PrewitmulHVsum = PrewitHmul + PrewitVmul; MyIfilt(:,:,n) = PrewitmulHVsum; %IaddPrewitmulHVsum = I + PrewitmulHVsum; %add the PrewitmulHVsum to the %filtered image before Prewit computation end disp('...Images Filtered')Construct Mesh
back to topfunction[V,SA,h] = myIConstruct(I)
%INPUT %pass the interpolated image stack % %OUTPUT %Volume (units cubed) %Area (units squared) %h, handle to figure with the surface are representation of volume %setup parameters for volume fill with tetrahedra %find if #objects > 1 %code not optimized for >1 objects, rather uses only largest object if >1 %objects. update later, can pass regions into vol2mesh %CC = bwconncomp(MyIBw,18); %(CC.NumObjects>1); %if more than one object compute stats for each object %individually %use vol2mesh ... xsize, ysize, zsize, to specify volumes xsize = 1:size(I,1); %use entire x volume ysize = 1:size(I,2); %use entire y volume zsize = 1:size(I,3); %use entire z volume levelset = 10; %[10 10 10]; %the isovalue opt = 3; %struct('radbound',{3 3 3}, 'distbound', {.5}); dofix = 1; %perform volume filtering/smoothing maxvol = 15; %maximum volume assigned to a single tetrahedron %vol2mesh(img,ix,iy,iz,opt,maxvol,dofix,method,isovalues) [node,elem,face] = vol2mesh(I,xsize,ysize,zsize,opt,maxvol,dofix,'cgalsurf',levelset); disp('Calculating...') assignin('base','node',node); %write to workspace assignin('base','elem',elem); %write to workspace assignin('base','face',face); %write to workspace trep = TriRep(elem(:,1:4),node(:,1:3)); %get triangulation representation % tetramesh(trep,'FaceColor','r','FaceAlpha',0.4) %plot tetrahedra % whitebg('w'); %set background color V = volume_3D(elem(:,1:4),node(:,1:3)); %compute volume of object [tri xf] = freeBoundary(trep); %use the trinagulation representation to get surface of volume SA = area_2D(tri,xf); %compute surface area of objectunit conversion
back to topVoxelSizeX = evalin('base','VoxelSizeX'); %pass the voxelsizeX VoxelXchar = num2str(VoxelSizeX); %the units are meters [Xdec] = strtok(VoxelXchar,'e'); %get the fraction [empty, Xexp] = strtok(VoxelXchar,'-'); %get the exponential Xdec = str2double(Xdec); %fraction Xexp = str2double(Xexp); %number of decimal places + or - %get the micrometer representation Xexpum = Xexp + 6; %10^6 um = 1m %fix the fraction by Xexpum, the decimal places remainder after um conversion Xdec = Xdec * 10^(Xexpum); %um units of perfect cube length V = V*Xdec^3; %convert voxels to um^3 assignin('base','V',V) disp(['Volume = ',num2str(V), ' um^3']); %display volume SA = SA*Xdec^2; %convert faces to um^2 disp(['Surface Area = ', num2str(SA), ' um^2']); %display surface area assignin('base','SA',SA) Myfile = evalin('base','Myfile'); %get Myfile from base Myfile = strtok(lower(Myfile),'x'); %parse Myfile = Myfile(1:end-2); %parse disp('Saving variables...') %save variables to file evalin('base', 'save(''MyData'', ''SA'', ''V'', ''VoxelSizeX'', ''Iinterp'', ''elem'', ''node'', ''face'', ''ThreshLevelinterp'', ''Myfile'');') %save variables to directory disp('...variables saved') disp('Drawing Surface...') %create strings for title/legend A = Myfile; B = ['Surface Area = ', num2str(SA), ' um^2']; C = ['Volume = ', num2str(V), ' um^3']; D = ['Voxel Unit Volume = ' num2str(Xdec), ' um^3']; %create char matrix with label strings maxlength = max([length(A) length(B) length(C) length(D)]); %find longest string E = nan(4,maxlength); %create numeric array that will fit largest string E = num2str(E); %convert to char E(:) = ' '; %fill with spaces (space bar) E(1,1:length(A)) = A; %fill with string A E(2,1:length(B)) = B; %fill with string B E(3,1:length(C)) = C; %fill with string C E(4,1:length(D)) = D; %fill with string D %draw surface reconstruction h = figure; trisurf(tri, xf(:,1), xf(:,2),... xf(:,3), 'FaceColor', 'r', 'FaceAlpha', 1); %plot the surface representation set(gca,'projection','perspective') %set perspective box off %turn off grid box % light('position',[1,1,1]) %set lighting top % light('position',[-1,-1,-1]) %set lighting bottom daspect([1,1,1]) %set aspect ratio axis on %leave axis on axis vis3d %set the axis so that rotating is smooth/non distorted view(-120,45) %set the view set(gca,'color',[1,1,1]) %set background color gca; %activate current figure legend(E,'Location','NorthOutside'); %place and position the legend myscreensize = get(0,'ScreenSize'); %get the screen size of monitor set(h,'Position',myscreensize); %set the figure to full screen zoom(1.5) %magnify the image % xlabel(['pixels(1pixel = ', num2str(VoxelSizeX), ' m)']) %set x-axis title % ylabel(['pixels(1pixel = ', num2str(VoxelSizeX), ' m)']) %set y-axis title % zlabel(['pixels(1pixel = ', num2str(VoxelSizeX), ' m)']) %set z-axis title hgsave(h,'Myreconstruction') %save drawing disp('...drawing complete')Resample by Interpolation
back to topfunction[Iinterp] = myIinterp(I,ThreshLevel)
%%Interpolate Image on zaxis %INPUT %load MyIcropsc, the filtered, cropped, and scaled image stack % %OUTPUT %interpolated image with interpolated binary mask applied % % %%Normalize images to 0 - 255, for optimal image processing with built in % %%functions, like im2bw, which use uint8 signature % for k = 1:size(I,3) % Itemp = I(:,:,k); % A = min(Itemp(:)); % B = max(Itemp(:)); % Itemp = 255*( (Itemp-A) / (B-A) ); %scale 0-255 % I(:,:,k) = Itemp; %reassign I % endVolume Interpolation
back to top%Depends on objective lens, zoom setting, z thickness %Interpolate on the z axis. %1:(1/a):n, where array length,(P) = an-(a-1), & n = #slices %To solve for a: %P = an - (a-1), where P = number of points & n = # slices %P = an - a + 1 %P-1 = a(n-1) %a = (P-1)/(n-1) %To solve for j, where j = # of points between slices: %j = 3; %integer number of slides to interpolate between consecutive slides %the # of slices, P, depends on the size in distance of the x and y axis, %for an image that measures 70 nm (x) by 70 nm (y) by 0.5um (z) per voxel, %an interpolation correction to make a perfect cube would require adjusting %the total number of slides in the z direction % pixels (z) = 0.5 um * 1/0.07um % = 7.1439 pixels % check answer: 0.5 um / 7.1439 pixels % = 0.07 um % Now we have a perfect cube volume where x,y,z = 0.07um % Upon interpolating, for every z slice, there should be 7.1439 slices % to make the 'perfect cube' correction. An interpolated image stack would have % 7.1439*slices(z) % % To final error is always +/- 1 pixel or +/- , because of rounding to whole % integer. %get voxel size from base workspace VoxelSizeZ = evalin('base','VoxelSizeZ'); VoxelSizeX = evalin('base','VoxelSizeX'); correctionZ = VoxelSizeZ/VoxelSizeX; %compute the interpolation correction for perfect cube % correctionZ = 7.1439; n = size(I,3); %number of images in stack P = ceil(correctionZ*n); %round interpolation integer number of slides %j = P/n - 1; %P = n*(j+1); %number of total images after interp a = (P-1)/(n-1); %divisor z = 1:(1/a):n; %interpolated axis x = evalin('base','DimensionX'); %get the width x = 1:x; y = evalin('base','DimensionY'); %get the height y = 1:y; % x = 1:1:512; %size of image width = height % y = x; %the x and y axis are both same size as canvas, so there is no interpolation disp('Making Meshgrid...'); [xi yi zi] = meshgrid(x, y, z); %create meshgrid disp('...Meshgrid Created'); disp('Interpolating...'); Iinterp = interp3(double(I),xi, yi, zi); %interpolate into xi yi zi space vi = interpolated MyIBw disp('...Interpolated'); disp('Making binary Mask...'); %interpolate the threshold values ThreshLevelinterp = interp1(1:length(ThreshLevel),ThreshLevel,z); assignin('base','ThreshLevelinterp',ThreshLevelinterp); %save to workspace %iterate through the interpolated images and apply ThreshLevelinterp Bwinterp = logical(I); se = strel('disk',3); %filter disk for k = 1:length(z) Bwinterptemp = im2bw(uint8(Iinterp(:,:,k)),ThreshLevelinterp(k)); %get binary image, use uint8 for im2bw operation Bwinterptemp = bwareaopen(Bwinterptemp,200); %delete small objects Bwinterp(:,:,k) = imclose(Bwinterptemp,se); %get rid of samll holes in objects end disp('...Binary Mask Made'); Iinterp = Iinterp.*Bwinterp; %output the masked interpolated imageMake Graphs
back to top% Execute in Stored Images folder directory cd([cd, '\Stored Images']) %get current directory addpath(genpath(cd)); %add all subfolders in directory mydir = dir; %get list of all files and folders in directory twicount = 1; %set counter wtcount = 1; %set counter for k = 1:length(mydir) %make loop that will go through all files and folders in directory tempstr = mydir(k).name; %make temporary string name twi = strfind(lower(tempstr),'twi'); %find 'twi' match, cast all characters to lower case, b/c case sensitive wt = strfind(lower(tempstr),'wt'); %find 'wt' match, cast all characters to lower case, b/c case sensitive if ~isempty(twi) %perform if found 'twi' Atemp = load([cd,'\',mydir(k).name,'\','MyData.mat'],'-mat', 'Myfile', 'SA','V'); %load data and store name, volume, and surface area to workspace TWIdataS(twicount,1) = Atemp; %save variables into cell twicount = twicount+1; %increment counter after variables entered into cell elseif ~isempty(wt) %perform if found 'wt' Atemp = load([cd,'\',mydir(k).name,'\','MyData.mat'],'-mat', 'Myfile', 'SA','V'); %load data and store name, volume, and surface area to workspace WTdataS(wtcount,1) = Atemp; %save variables into cell wtcount = wtcount+1; %increment counter after variables entered into cell else continue %continue loop if neither found end end % loop throuch cells and extract surface area and volume data for k = 1:length(TWIdataS) TWISA(k,1) = TWIdataS(k,1).SA; %place all surface data into single variable TWIV(k,1) = TWIdataS(k,1).V; %place all volume data into single variable end % loop throuch cells and extract surface area and volume data for k = 1:length(WTdataS) WTSA(k,1) = WTdataS(k,1).SA; %place all surface data into single variable WTV(k,1) = WTdataS(k,1).V; %place all volume data into single variable end %rearrange variables and place into a single array Gmax = max(length(TWIdataS),length(WTdataS)); %find variable with greatest entries Data = nan(Gmax,4); %create empty variable with respect to largest Data(1:length(TWISA),1:2) = [TWISA TWIV]; %enter 'twi' data into first two columns % TWISA = Data(1,:); % TWIV = Data(2,:); Data(1:length(WTSA),3:4) = [WTSA WTV]; %enter 'wt' data into first two rows % WTSA = Data(3,:); % WTV = Data(4,:); Data = cat(1,Data(:,1:2),Data(:,3:4)); %rearrange variable A = cell(Gmax,1); %create cell aray with respect to largest data set A(:) = {'Twitcher'}; %enter names into cells B = cell(Gmax,1); %create cell aray with respect to largest data set B(:) = {'Wild Type'}; %enter names into cells Groups = cat(1,A,B); %concatenante cells Groups = nominal(Groups); %use built in functions, see matlab help % Data = [TWISA TWIV;... % WTSA WTV;]; %[order,number,group_median,group_iqr] = grpstats(Data,Groups2,{'gname','numel',@median,@iqr}) % Raw Data Values %create parameters for data sets NumObs = size(Data,1); %#of observations NameObs = strcat({'Obs'},num2str((1:NumObs)','%d')); iris = dataset({Groups,'Strain'}, {Data,'SA','V'}, 'ObsNames', NameObs); % Stats [m,s] = grpstats(Data,Groups,{'mean','sem'}); %mean standard error of the mean [h,p] = ttest2([TWISA TWIV],[WTSA WTV]); %ttest figure; axis([0,20,0,20]); text(9.54,10,{'TTest, P Statistic';... ['Area (um^2) ', num2str(p(1))];... ['Volume (um^3) ', num2str(p(2))]},... 'horizontalalignment', 'center','fontweight', 'bold',... 'backgroundcolor', 'w', 'verticalalignment', 'middle',... 'fontsize', 24); set(gca,'XTickLabel',[]) set(gca,'XTick',[]) set(gca,'YTickLabel',[]) set(gca,'YTick',[]) box off % Scatter Plot subset = ismember(Groups,{'Twitcher','Wild Type'}); scattergroup = Groups(subset); figure; gscatter(iris.SA(subset), iris.V(subset), scattergroup,'k','.o',[8 10]) xlabel('Surface Area um^2') ylabel('Volume um^3') title({'NMJ Morphology Scatter Plot';'Pre Synaptic Axon'}) legend('Location','best') % Box Plots figure; subplot(1,2,1); boxplot(Data(:,1),Groups,'Colors','k','whisker',inf); ylabel('Surface Area um^2'); title({'NMJ Morphology Box Plot';'Pre Synaptic Axon'}) box off subplot(1,2,2); boxplot(Data(:,2),Groups','Colors','k','whisker',inf); ylabel('Volume um^3'); title({'NMJ Morphology Box Plot';'Pre Synaptic Axon'}) box off % Bar Plot figure; subplot(1,2,1) bar(1,m(1,1),'FaceColor','w') hold on bar(2,m(2,1),'k') legend('Twitcher','Wild Type','Location','best') errorbar([1;2],m(:,1),[0;0],s(:,1),'lineStyle','none','Color','k') hold off set(gca,'XTickLabel',[]) ylabel('Surface Area um^2') title({'NMJ Morphology Bar Plot & SEM';'Pre Synaptic Axon'}) box off subplot(1,2,2) bar(1,m(1,2),'FaceColor','w') hold on bar(2,m(2,2),'k') legend('Twitcher','Wild Type','Location','best') errorbar([1;2],m(:,2),[0;0],s(:,2),'lineStyle','none','Color','k') hold off set(gca,'XTickLabel',[]) ylabel('Volume um^3') title({'NMJ Morphology Bar Plot & SEM';'Pre Synaptic Axon'}) box offMake Movie
back to top%Open video object and append frames from Image stack aviobj = VideoWriter([Myfile,'.avi']); %make file name aviobj.FrameRate = 30; %frames per second aviobj.Quality = 100; %percent quality open(aviobj); %open an object file currentAZ = -120; currentEL = 45; h = figure('renderer','zbuffer'); %a1 = subplot(1,2,1); %subplot(1,1,1); trisurf(tri, xf(:,1), xf(:,2),... xf(:,3), 'FaceColor', 'r', 'FaceAlpha', 1); %plot the surface representation a1 = gca; set(gca,'projection','perspective') %set perspective set(gca,'NextPlot','replacechildren') box off %turn off grid box % light('position',[1,1,1]) %set lighting top % light('position',[-1,-1,-1]) %set lighting bottom daspect([1,1,1]) %set aspect ratio axis vis3d % axis off %leave axis on set(gca,'color',[1,1,1]) %set background color gca; %activate current figure legend(E,'Location','NorthOutside'); view(currentAZ,currentEL); % a2 = subplot(1,2,2); % trisurf(tri, xf(:,1), xf(:,2),... % xf(:,3), 'FaceColor', 'r', 'FaceAlpha', 1); %plot the surface representation % set(gca,'projection','perspective') %set perspective % box off %turn off grid box % % light('position',[1,1,1]) %set lighting top % % light('position',[-1,-1,-1]) %set lighting bottom % daspect([1,1,1]) %set aspect ratio % axis vis3d % % axis off %leave axis on % set(gca,'color',[1,1,1]) %set background color % gca; %activate current figure % view(currentAZ,currentEL); a1; zoom(a1,1.75); % a2; % zoom(a2,1.75); % myscreensize = get(0,'ScreenSize'); % set(h,'Position',myscreensize); set(h,'Position',[50 50 800 600]); flip = 0; for k = 1:4:360 view(a1,currentAZ+k, currentEL); % view(a2,currentAZ, currentEL+k); %pause(0.01); F = getframe(h); %get current figure handle writeVideo(aviobj,F); %write current frame to aviobj end close(gcf); close(aviobj);iso2mesh
back to top%iso2mesh - a compact, powerful yet simple-to-use 3D mesh generator % The author of "iso2mesh" toolbox is Qianqian Fang. Qianqian % is currently an Assistant Professor at Massachusetts General Hospital, % Harvard Medical School. % % Address: Martinos Center for Biomedical Imaging, % Massachusetts General Hospital, % Harvard Medical School % Bldg 149, 13th St, Charlestown, MA 02129, USA % URL: http://nmr.mgh.harvard.edu/~fangq/ % Email: <fangq at nmr.mgh.harvard.edu> or <fangqq at gmail.com> % % % Other people had also contributed to this toolbox, they include % % - Aslak Grinsted <ag at glaciology.net> % - Hang Si <si at wias-berlin.de> % - Pierre Alliez <pierre.alliez at sophia.inria.fr> % - Laurent Rineau <laurent.rineau__CGAL at normalesup.org> % - Donghyeon Kim <danielkim at gist.ac.kr> % - Blake Johnson <bjohnso at bbn.com> % - Niclas Borlin <Niclas.Borlin at cs.umu.se> % GNU GENERAL PUBLIC LICENSE % Version 2, June 1991 % % Copyright (C) 1989, 1991 Free Software Foundation, Inc. % 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA % Everyone is permitted to copy and distribute verbatim copies % of this license document, but changing it is not allowed.