Code covered by the BSD License  

Highlights from
Digital Image Correlation and Tracking

from Digital Image Correlation and Tracking by Christoph Eberl
Calculate displacement and strain from a series of images

[rasterx, rastery, validx,validy,x,y]=ppselection_func(validx,validy,x,y);
% written by Chris

function [rasterx, rastery, validx,validy,x,y]=ppselection_func(validx,validy,x,y);

% Code to analyze the displacement data (contained by validx and validy)
% Programmed by Chris
% Last revision: 8/24/06

% Prompt user for displacement data
if exist('validx')==0
    [validx,Pathvalidx] = uigetfile('*.mat','Open validx.mat');
    if validx==0
        return;
    end
    cd(Pathvalidx);
    validx=importdata(validx,'\t');
end
if exist('validy')==0
    [validy,Pathvalidy] = uigetfile('*.mat','Open validy.mat');
    if validy==0
        return;
    end
    cd(Pathvalidy);
    validy=importdata(validy,'\t');
end

% Checking for plot orientation and give standard orientations
if exist('x')==0
    x=1;
    y=2;
end
if x~1|2|3
    x=1;
    y=2;
end

validxbackup=validx;
validybackup=validy;

% Choose an image
[looppoints loopimages]=size(validx);
selectedimage=0;
prompt = {'From which image do you want to select the view?'};
dlg_title = 'Marker selection';
num_lines= 1;
if selectedimage==0
    defaultimage=loopimages;
end
if selectedimage~0
    defaultimage=selectedimage;
end
def     = {num2str(defaultimage)};
answer = inputdlg(prompt,dlg_title,num_lines,def);
selectedimage = str2num(cell2mat(answer(1,1)));
if selectedimage>loopimages
    selectedimage=loopimages;
end
if selectedimage<1
    selectedimage=1;
end
rasterx=0;
rastery=0;
% Call the selection tool
[rasterx, rastery, validx,validy,x,y]=gridtypeselection(validx,validy,x,y,selectedimage,rasterx,rastery);

return

%-------------------------------
%
% Decide which type of raster you want to analyze

function [rasterx, rastery, validx,validy,x,y] = gridtypeselection(validx,validy,x,y,selectedimage,rasterx,rastery);

gridselection = menu(sprintf('Which type of grid do you want to use'),...
    'Two Markers','Rectangular','Two Rectangles of Markers','Circular','Line','Change view','Cancel');

if gridselection==1
    [validx,validy,rasterx, rastery,selectedimage,x,y]=twop_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
    exist('validx');
    exist('validy');
    exist('rasterx');
    exist('rastery');
    exist('x');
    exist('y');
    return
end

if gridselection==2
    [validx,validy,rasterx, rastery,selectedimage,x,y]=rect_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
    exist('validx');
    exist('validy');
    exist('rasterx');
    exist('rastery');
    exist('x');
    exist('y');
    return
end

if gridselection==5
    [validx,validy,rasterx, rastery,selectedimage,x,y]=line_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
    exist('validx');
    exist('validy');
    exist('rasterx');
    exist('rastery');
    exist('x');
    exist('y');
    return
end

if gridselection==3
    [validx,validy,rasterx, rastery,selectedimage,x,y]=tworect_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
    exist('validx');
    exist('validy');
    exist('rasterx');
    exist('rastery');
    exist('x');
    exist('y');
    return
end

if gridselection==4
    [validx,validy,rasterx, rastery,selectedimage,x,y]=circ_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
    exist('validx');
    exist('validy');
    exist('rasterx');
    exist('rastery');
    exist('x');
    exist('y');
    return
end

if gridselection==6
    [validx,validy,x,y,selectedimage,rasterx,rastery] = change_view_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
    exist('validx');
    exist('validy');
    exist('rasterx');
    exist('rastery');
    exist('x');
    exist('y');
end

if gridselection==7
    close all
    exist('validx');
    exist('validy');
    exist('rasterx');
    exist('rastery');
    exist('x');
    exist('y');
    if exist('validx')==0
        validx=0;
        validy=0;
    end
    if exist('rasterx')==0
        rasterx=0;
        rastery=0;
    end
    if exist('x')==0
        x=0;
        y=0;
    end
end

if exist('validx')==0
    validx=0
    validy=0
end
if exist('rasterx')==0
    rasterx=0
    rastery=0
end
if exist('x')==0
    x=0
    y=0
end

return

%-------------------------------
%
% Change the view

function [validx,validy,x,y,selectedimage,rasterx,rastery] = change_view_displ(validx,validy,x,y,selectedimage,rasterx,rastery);

[looppoints loopimages]=size(validx);
if x==1
    pos=validx;
end
if x==2
    pos=validy;
end
if x==3
    validxfirst=zeros(size(validx));
    validxfirst=validx(:,1)*ones(1,loopimages);
    pos=validx-validxfirst;
end
if x==4
    validyfirst=zeros(size(validy));
    validyfirst=validy(:,1)*ones(1,loopimages);
    pos=validy-validyfirst;
end
if y==1
    displ=validx;
end
if y==2
    displ=validy;
end
if y==3
    validxfirst=zeros(size(validx));
    validxfirst=validx(:,1)*ones(1,loopimages);
    displ=validx-validxfirst;
end
if y==4
    validyfirst=zeros(size(validy));
    validyfirst=validy(:,1)*ones(1,loopimages);
    displ=validy-validyfirst;
end

h=figure;
plot(pos(:,selectedimage),displ(:,selectedimage),'o','MarkerEdgeColor','k','MarkerFaceColor','g')

title(sprintf('View.') )

changeviewselection = menu(sprintf('Do you want to change the coordinate system to select markers?'),...
    'x-position vs. y-position','x-position vs. x-displacement','y-position vs. x-displacement',...
    'x-position vs. y-displacement','y-position vs. y-displacement','Change image #','Go back to grid-type selection');

if changeviewselection==1
    close all
    x=1;
    y=2;
    [validx,validy,x,y,selectedimage,rasterx,rastery] = change_view_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
end
if changeviewselection==2
    close all
    x=1;
    y=3;
    [validx,validy,x,y,selectedimage,rasterx,rastery] = change_view_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
end
if changeviewselection==3
    close all
    x=2;
    y=3;
    [validx,validy,x,y,selectedimage,rasterx,rastery] = change_view_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
end
if changeviewselection==4
    close all
    x=1;
    y=4;
    [validx,validy,x,y,selectedimage,rasterx,rastery] = change_view_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
end
if changeviewselection==5
    close all
    x=2;
    y=4;
    [validx,validy,x,y,selectedimage,rasterx,rastery] = change_view_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
end
if changeviewselection==6
    prompt = {'From which image do you want to select the view?'};
    dlg_title = 'Marker selection';
    num_lines= 1;
    if selectedimage==0
        defaultimage=loopimages;
    end
    if selectedimage~0
        defaultimage=selectedimage;
    end
    def     = {num2str(defaultimage)};
    answer = inputdlg(prompt,dlg_title,num_lines,def);
    selectedimage = str2num(cell2mat(answer(1,1)));
    if selectedimage>loopimages
        selectedimage=loopimages;
    end
    if selectedimage<1
        selectedimage=1;
    end
    [validx,validy,x,y,selectedimage,rasterx,rastery] = change_view_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
end
if changeviewselection==7
    close all
    [rasterx, rastery, validx,validy,x,y]=gridtypeselection(validx,validy,x,y,selectedimage,rasterx,rastery);
end

%-------------------------------
%
% Define two rectangles and add them to one marker array

function [validx,validy,rasterx,rastery,selectedimage,x,y] = tworect_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);

[validx,validy,rasterx1, rastery1,selectedimage]=rect_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
[validx,validy,rasterx2, rastery2,selectedimage]=rect_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);

% if size(rasterx1)~size(rasterx2)
%     close all
%     rasterx=0;rastery=0;
%     return
% end

rasterx=[rasterx1; rasterx2];
rastery=[rastery1; rastery2];

if x==1
    pos1=validx;pos2=rasterx;
end
if x==2
    pos1=validy;pos2=rasterx;
end
if x==3
    validxfirst=zeros(size(validx));rasterxfirst=zeros(size(rasterx));
    validxfirst=validx(:,1)*ones(1,loopimages);rasterxfirst=rasterx(:,1)*ones(1,loopimages);
    pos1=validx-validxfirst;pos2=rasterx-rasterxfirst;
end
if x==4
    validyfirst=zeros(size(validy));rasteryfirst=zeros(size(rastery));
    validyfirst=validy(:,1)*ones(1,loopimages);rasteryfirst=rastery(:,1)*ones(1,loopimages);
    pos1=validy-validyfirst;pos2=rastery-rasteryfirst;
end
if y==1
    displ1=validx;displ2=rasterx;
end
if y==2
    displ1=validy;displ2=rastery;
end
if y==3
    validyfirst=zeros(size(validy));rasteryfirst=zeros(size(rastery));
    validyfirst=validy(:,1)*ones(1,loopimages);rasteryfirst=rastery(:,1)*ones(1,loopimages);
    displ1=validy-validyfirst;displ2=rastery-rasteryfirst;
end

[looppoints loopimages]=size(validx);
defaultimage=loopimages;

prompt = {'From which image do you want to select the rectangles?'};
dlg_title = 'Marker selection';
num_lines= 1;
if selectedimage==0
    defaultimage=loopimages;
end
if selectedimage~0
    defaultimage=selectedimage;
end
def     = {num2str(defaultimage)};
answer = inputdlg(prompt,dlg_title,num_lines,def);
selectedimage = str2num(cell2mat(answer(1,1)));
if selectedimage>loopimages
    selectedimage=loopimages;
end
if selectedimage<1
    selectedimage=1;
end

h=figure;
plot(pos1(:,selectedimage),displ1(:,selectedimage),'o','MarkerEdgeColor','k','MarkerFaceColor','g')
hold on
plot(pos2(:,selectedimage),displ2(:,selectedimage),'o','MarkerEdgeColor','k','MarkerFaceColor','r')

% Accept the chosen markers, try again or give up 

confirmcircselection = menu(sprintf('Do you want to use these markers?'),...
    'Yes','No, try again','Go back to grid-type selection');

if confirmcircselection==2
    close all
    [validx,validy,rasterx,rastery,selectedimage,x,y] = tworect_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
end

if confirmcircselection==3
    close all
    [rasterx, rastery,validx,validy, x,y] = gridtypeselection(validx,validy,x,y,selectedimage,rasterx,rastery);
end

if confirmcircselection==1
    close all
end

%-------------------------------
%
% Define line and find markers

function [validx,validy,rasterx,rastery,selectedimage,x,y]=line_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);

[looppoints loopimages]=size(validx);
defaultimage=loopimages;

if x==1
    pos=validx;
end
if x==2
    pos=validy;
end
if x==3
    validxfirst=zeros(size(validx));
    validxfirst=validx(:,1)*ones(1,loopimages);
    pos=validx-validxfirst;
end
if x==4
    validyfirst=zeros(size(validy));
    validyfirst=validy(:,1)*ones(1,loopimages);
    pos=validy-validyfirst;
end
if y==1
    displ=validx;
end
if y==2
    displ=validy;
end
if y==3
    validxfirst=zeros(size(validx));
    validxfirst=validx(:,1)*ones(1,loopimages);
    displ=validx-validxfirst;
end
if y==4
    validyfirst=zeros(size(validy));
    validyfirst=validy(:,1)*ones(1,loopimages);
    displ=validy-validyfirst;
end

prompt = {'From which image do you want to select markers?'};
dlg_title = 'Marker selection';
num_lines= 1;
if selectedimage==0
    defaultimage=loopimages;
end
if selectedimage~0
    defaultimage=selectedimage;
end
def     = {num2str(defaultimage)};
answer = inputdlg(prompt,dlg_title,num_lines,def);
selectedimage = str2num(cell2mat(answer(1,1)));
if selectedimage>loopimages
    selectedimage=loopimages;
end
if selectedimage<1
    selectedimage=1;
end

h=figure;
plot(pos(:,selectedimage),displ(:,selectedimage),'o','MarkerEdgeColor','k','MarkerFaceColor','g')

title(sprintf('Pick two points on the sample.') )

[xpos(1,1),ypos(1,1)]=ginput(1);
hold on
plot(xpos(1,1),ypos(1,1),'+g')

[xpos(2,1),ypos(2,1)]=ginput(1);
plot(xpos(2,1),ypos(2,1),'+g')

centerpoint=[xpos(1,1)+(xpos(2,1)-xpos(1,1))/2; ypos(1,1)+(ypos(2,1)-ypos(1,1))/2];
plot(centerpoint(1,1),centerpoint(2,1),'+b')

linelength=sqrt((xpos(2,1)-xpos(1,1))*(xpos(2,1)-xpos(1,1))+(ypos(2,1)-ypos(1,1))*(ypos(2,1)-ypos(1,1)));
lineslope=(ypos(2,1)-ypos(1,1))/(xpos(2,1)-xpos(1,1));
intersecty=ypos(1,1)-lineslope*xpos(1,1);
ycalc=zeros(2,1);
ycalc=lineslope*xpos+intersecty;
plot(xpos(:,1),ycalc(:,1),'-b')
intercept=[0; centerpoint(2,1)-centerpoint(1,1)*(-1/lineslope)];

distancefromline=(abs((xpos(2,1)-xpos(1,1))*(ypos(1,1)-displ(:,selectedimage))-(xpos(1,1)-pos(:,selectedimage))*(ypos(2,1)-ypos(1,1))))/sqrt((xpos(2,1)-xpos(1,1))*(xpos(2,1)-xpos(1,1))+(ypos(2,1)-ypos(1,1))*(ypos(2,1)-ypos(1,1)));
distancefromcenterpoint=(abs((intercept(1,1)-centerpoint(1,1))*(centerpoint(2,1)-displ(:,selectedimage))-(centerpoint(1,1)-pos(:,selectedimage))*(intercept(2,1)-centerpoint(2,1))))/sqrt((intercept(1,1)-centerpoint(1,1))*(intercept(1,1)-centerpoint(1,1))+(intercept(2,1)-centerpoint(2,1))*(intercept(2,1)-centerpoint(2,1)));

linewidthquestion=0;
linewidth=20;

while linewidthquestion==0
    prompt = {'Enter the width of the line in [pixel]:'};
    dlg_title = 'Input for grid creation';
    num_lines= 1;
    def     = {num2str(linewidth)};
    answer = inputdlg(prompt,dlg_title,num_lines,def);
    linewidth = str2num(cell2mat(answer(1,1)))
    
    selectpoints=find(distancefromline<linewidth & distancefromcenterpoint<linelength/2);
    plot(pos(selectpoints,selectedimage),displ(selectpoints,selectedimage),'.r')
    drawnow
    
    confirmlineselection = menu(sprintf('Do you want to use these markers?'),...
        'Yes','No, try different linewidth','No, different line','Go back to grid-type selection');
    
    if confirmlineselection==1
        close all
        linewidthquestion=1;
        rasterx=[validx(selectpoints,:);validx(selectpoints,:)];
        rastery=[validy(selectpoints,:);validy(selectpoints,:)];
        close all
    end
    if confirmlineselection==2
        hold off
        plot(pos(:,selectedimage),displ(:,selectedimage),'o','MarkerEdgeColor','k','MarkerFaceColor','g')
        hold on
        plot(xpos(:,1),ycalc(:,1),'-b')
        plot(xpos(1,1),ypos(1,1),'+g')
        plot(xpos(2,1),ypos(2,1),'+g')
    end
    if confirmlineselection==3
        close all
        linewidthquestion=1;
        [validx,validy,rasterx, rastery,selectedimage,x,y]=line_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
    end
    
    if confirmlineselection==4
        close all
        linewidthquestion=1;
        [rasterx, rastery,validx,validy, x,y] = gridtypeselection(validx,validy,x,y,selectedimage,rasterx,rastery);
    end
    
end

%-------------------------------
%
% Choose two markers

function [validx,validy,rasterx, rastery,selectedimage,x,y]=twop_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);

[looppoints loopimages]=size(validx);
defaultimage=loopimages;

if x==1
    pos=validx;
end
if x==2
    pos=validy;
end
if x==3
    validxfirst=zeros(size(validx));
    validxfirst=validx(:,1)*ones(1,loopimages);
    pos=validx-validxfirst;
end
if x==4
    validyfirst=zeros(size(validy));
    validyfirst=validy(:,1)*ones(1,loopimages);
    pos=validy-validyfirst;
end
if y==1
    displ=validx;
end
if y==2
    displ=validy;
end
if y==3
    validxfirst=zeros(size(validx));
    validxfirst=validx(:,1)*ones(1,loopimages);
    displ=validx-validxfirst;
end
if y==4
    validyfirst=zeros(size(validy));
    validyfirst=validy(:,1)*ones(1,loopimages);
    displ=validy-validyfirst;
end
prompt = {'From which image do you want to select markers?'};
dlg_title = 'Marker selection';
num_lines= 1;
if selectedimage==0
    defaultimage=loopimages;
end
if selectedimage~0
    defaultimage=selectedimage;
end
def     = {num2str(defaultimage)};
answer = inputdlg(prompt,dlg_title,num_lines,def);
selectedimage = str2num(cell2mat(answer(1,1)));
if selectedimage>loopimages
    selectedimage=loopimages;
end
if selectedimage<1
    selectedimage=1;
end

h=figure;
plot(pos(:,selectedimage),displ(:,selectedimage),'o','MarkerEdgeColor','k','MarkerFaceColor','g')

title(sprintf('Pick two markers.') )

[xpos(1,1),ypos(1,1)]=ginput(1);
whereisthispoint=abs(pos(:,selectedimage)-xpos(1,1))+abs(displ(:,selectedimage)-ypos(1,1));
selectedpoint1=find(whereisthispoint==min(whereisthispoint));
hold on
plot(pos(selectedpoint1,selectedimage),displ(selectedpoint1,selectedimage),'+r')

[xpos(2,1),ypos(2,1)]=ginput(1);
whereisthispoint=abs(pos(:,selectedimage)-xpos(2,1))+abs(displ(:,selectedimage)-ypos(2,1));
selectedpoint2=find(whereisthispoint==min(whereisthispoint));
plot(pos(selectedpoint2,selectedimage),displ(selectedpoint2,selectedimage),'+r')


% Accept the chosen markers, try again or give up 

confirmcircselection = menu(sprintf('Do you want to use these two markers?'),...
    'Yes','No, try again','Go back to grid-type selection');

if confirmcircselection==2
    close all
    hold off
    [validx,validy,rasterx,rastery,selectedimage,x,y]=twop_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
end

if confirmcircselection==3
    close all
    [rasterx,rastery,validx,validy,x,y]=gridtypeselection(validx,validy,x,y,selectedimage,rasterx,rastery);
end

if confirmcircselection==1
    rasterx=[validx(selectedpoint1,:);validx(selectedpoint2,:)];
    rastery=[validy(selectedpoint1,:);validy(selectedpoint2,:)];
    close all
end

%-------------------------------
%
%Circular selection

function [validx,validy,rasterx,rastery,selectedimage,x,y] = circ_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);

if x==1
    pos=validx;
end
if x==2
    pos=validy;
end
if x==3
    validxfirst=zeros(size(validx));
    validxfirst=validx(:,1)*ones(1,loopimages);
    pos=validx-validxfirst;
end
if x==4
    validyfirst=zeros(size(validy));
    validyfirst=validy(:,1)*ones(1,loopimages);
    pos=validy-validyfirst;
end
if y==1
    displ=validx;
end
if y==2
    displ=validy;
end
if y==3
    validxfirst=zeros(size(validx));
    validxfirst=validx(:,1)*ones(1,loopimages);
    displ=validx-validxfirst;
end
if y==4
    validyfirst=zeros(size(validy));
    validyfirst=validy(:,1)*ones(1,loopimages);
    displ=validy-validyfirst;
end
h=figure;
plot(pos(:,selectedimage),displ(:,selectedimage),'.b')
% axis equal

title(sprintf('Pick three points on the circle in clockwise order with the highest radius.') )

[xpos(1,1),ypos(1,1)]=ginput(1);
hold on
plot(xpos(1,1),ypos(1,1),'+g')

[xpos(2,1),ypos(2,1)]=ginput(1);
plot(xpos(2,1),ypos(2,1),'+g')

[xpos(3,1),ypos(3,1)]=ginput(1);
plot(xpos(3,1),ypos(3,1),'+g')

% Calculate center between the 3 sorted points and the normal slope of the vectors
slope12=-1/((ypos(2,1)-ypos(1,1))/(xpos(2,1)-xpos(1,1)));
slope23=-1/((ypos(3,1)-ypos(2,1))/(xpos(3,1)-xpos(2,1)));
center12(1,1)=(xpos(2,1)-xpos(1,1))/2+xpos(1,1);
center12(1,2)=(ypos(2,1)-ypos(1,1))/2+ypos(1,1);
center23(1,1)=(xpos(3,1)-xpos(2,1))/2+xpos(2,1);
center23(1,2)=(ypos(3,1)-ypos(2,1))/2+ypos(2,1);
plot(center12(1,1),center12(1,2),'+b')
plot(center23(1,1),center23(1,2),'+b')

if slope12==slope23
    [validx,validy,rasterx,rastery,selectedimage,x,y] = circ_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery)
end

% Calculate the crossing point of the two vectors
achsenabschnitt1=center12(1,2)-center12(1,1)*slope12;
achsenabschnitt2=center23(1,2)-center23(1,1)*slope23;
xcross=(achsenabschnitt2-achsenabschnitt1)/(slope12-slope23);
ycross=slope12*xcross+achsenabschnitt1;
xdata=min(xpos):xcross;
ydata1=achsenabschnitt1+slope12*xdata;
ydata2=achsenabschnitt2+slope23*xdata;

% Calculate radius
R=sqrt((xcross-xpos(1,1))*(xcross-xpos(1,1))+(ycross-ypos(1,1))*(ycross-ypos(1,1)))

% Calculate angle between vectors
xvector=[1;0];
x1vec(1,1)=xpos(1,1)-xcross;x1vec(2,1)=ypos(1,1)-ycross;
x3vec(1,1)=xpos(3,1)-xcross;x3vec(2,1)=ypos(3,1)-ycross;
alpha13=acos((dot(x1vec,x3vec))/(sqrt(x1vec'*x1vec)*sqrt(x3vec'*x3vec)))*180/pi;
alpha01=acos((dot(xvector,x1vec))/(sqrt(x1vec'*x1vec)*sqrt(xvector'*xvector)))*180/pi;
if ypos(1,1)<ycross
    alpha01=alpha01*(-1)+360;
end
alpha03=acos((dot(xvector,x3vec))/(sqrt(xvector'*xvector)*sqrt(x3vec'*x3vec)))*180/pi;
if ypos(3,1)<ycross
    alpha03=alpha03*(-1)+360;
end
totalangle=alpha13
minangle=alpha01
maxangle=alpha03

angldiv=abs(round(totalangle))*10;
anglstep=(totalangle/angldiv);
anglall(1:angldiv+1)=minangle-anglstep*(1:angldiv+1)-anglstep;
xcircle(1:angldiv+1)=xcross+R*cos(anglall(1:angldiv+1)/180*pi);
ycircle(1:angldiv+1)=ycross+R*sin(anglall(1:angldiv+1)/180*pi);
plot(xcircle,ycircle,'-r');
drawnow

% Accept the chosen circle, try again or give up 
confirmcircselection = menu(sprintf('Do you want to use this circle as basis?'),...
    'Yes','No, try again','Go back to grid-type selection');
if confirmcircselection==2
    close all
    hold off
    [validx,validy,rasterx,rastery,selectedimage,x,y] = circ_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
end

if confirmcircselection==3
    close all
    [rasterx,rastery,validx,validy,x,y]=gridtypeselection(validx,validy,x,y,selectedimage,rasterx,rastery);
end

if confirmcircselection==1
    
    % Pick the lower bound in the image
    title(sprintf('Pick lower bound for the raster') )
    
    [xpos(4,1),ypos(4,1)]=ginput(1);
    hold on
    plot(xpos(1,1),ypos(1,1),'+r')
    
    R2=sqrt((xcross-xpos(4,1))*(xcross-xpos(4,1))+(ycross-ypos(4,1))*(ycross-ypos(4,1)))
    xcrossmatrix=ones(size(pos(:,selectedimage)))*xcross;
    ycrossmatrix=ones(size(pos(:,selectedimage)))*ycross;
    
    % Calculate Radius for all points
    Rall=sqrt((xcrossmatrix-pos(:,selectedimage)).*(xcrossmatrix-pos(:,selectedimage))+(ycrossmatrix-displ(:,selectedimage)).*(ycrossmatrix-displ(:,selectedimage)));
    
    % Calculate Angle for all points relativ to circle center
    newpos=pos(:,selectedimage)-xcross;newdispl=displ(:,selectedimage)-ycross;
    angleallpoints=acos((newpos.*xvector(1,1)+newdispl.*xvector(2,1))./(sqrt(newpos.*newpos+newdispl.*newdispl).*sqrt(xvector(1,1).*xvector(1,1)+xvector(2,1).*xvector(2,1))))*180/pi;
    negativangle=find(displ(:,selectedimage)<ycross);
    angleallpoints(negativangle)=angleallpoints(negativangle)*(-1)+360;
    selectpoints=find(Rall>min(R,R2) & Rall<max(R,R2) & angleallpoints>maxangle & angleallpoints<minangle);
    plot(pos(selectpoints,selectedimage),displ(selectpoints,selectedimage),'.r')
    drawnow
    
    
    % Do you want to keep the grid?
    confirmselectionraster = menu(sprintf('Do you want to use this raster?'),...
        'Yes','No, try again','Go back to raster-type selection');
    
    if confirmselectionraster==1
        rasterx=pos(selectpoints,:);
        rastery=displ(selectpoints,:);
        close all
    end
    
    if confirmselectionraster==2
        rasterx=0;
        rastery=0;
        close all
        hold off
        exist('rasterx')
        exist('rastery')
        exist('x')
        exist('y')
        exist('validx')
        exist('validy')
        [validx,validy,rasterx,rastery,selectedimage,x,y] = circ_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
    end
    
    if confirmselectionraster==3
        close all
        [rasterx,rastery,validx,validy,x,y]=gridtypeselection(validx,validy,x,y,selectedimage,rasterx,rastery);
    end
    
    
end    

% 
%-------------------------------
%

function [validx,validy,rasterx, rastery,selectedimage,x,y]=rect_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);

[looppoints loopimages]=size(validx);
defaultimage=loopimages;

if x==1
    pos=validx;
end
if x==2
    pos=validy;
end
if x==3
    validxfirst=zeros(size(validx));
    validxfirst=validx(:,1)*ones(1,loopimages);
    pos=validx-validxfirst;
end
if x==4
    validyfirst=zeros(size(validy));
    validyfirst=validy(:,1)*ones(1,loopimages);
    pos=validy-validyfirst;
end
if y==1
    displ=validx;
end
if y==2
    displ=validy;
end
if y==3
    validxfirst=zeros(size(validx));
    validxfirst=validx(:,1)*ones(1,loopimages);
    displ=validx-validxfirst;
end
if y==4
    validyfirst=zeros(size(validy));
    validyfirst=validy(:,1)*ones(1,loopimages);
    displ=validy-validyfirst;
end

prompt = {'From which image do you want to select markers?'};
dlg_title = 'Marker selection';
num_lines= 1;
if selectedimage==0
    defaultimage=loopimages;
end
if selectedimage~0
    defaultimage=selectedimage;
end
def     = {num2str(defaultimage)};
answer = inputdlg(prompt,dlg_title,num_lines,def);
selectedimage = str2num(cell2mat(answer(1,1)));
if selectedimage>loopimages
    selectedimage=loopimages;
end
if selectedimage<1
    selectedimage=1;
end

h=figure;
plot(pos(:,selectedimage),displ(:,selectedimage),'o','MarkerEdgeColor','k','MarkerFaceColor','g')
title(sprintf('Define the region of interest.  Pick (single click) a point in the LOWER LEFT of your selection.\n  Do the same for a point in the UPPER RIGHT.'))
hold on
[xpos(1,1),ypos(1,1)]=ginput(1);
hold on
plot(xpos(1,1),ypos(1,1),'+b')
drawnow

[xpos(2,1),ypos(2,1)]=ginput(1);
hold on
plot(xpos(2,1),ypos(2,1),'+b')
drawnow

xmin = min(xpos);
xmax = max(xpos);
ymin = min(ypos);
ymax = max(ypos);

lowerline=[xmin ymin; xmax ymin];
upperline=[xmin ymax; xmax ymax];
leftline=[xmin ymin; xmin ymax];
rightline=[xmax ymin; xmax ymax];

plot(lowerline(:,1),lowerline(:,2),'-b')
plot(upperline(:,1),upperline(:,2),'-b')
plot(leftline(:,1),leftline(:,2),'-b')
plot(rightline(:,1),rightline(:,2),'-b')

selectpoints=find(pos(:,selectedimage)>min(xpos) & pos(:,selectedimage)<max(xpos) & displ(:,selectedimage)<max(ypos) & displ(:,selectedimage)>min(ypos))
clear pos
clear displ

if x==1
    pos=validx(selectpoints,:);
end
if x==2
    pos=validy(selectpoints,:);
end
if x==3
    validxfirst=zeros(size(validx));
    validxfirst=validx(:,1)*ones(1,loopimages);
    pos=validx(selectpoints,:)-validxfirst(selectpoints,:);
end
if x==4
    validyfirst=zeros(size(validy));
    validyfirst=validy(:,1)*ones(1,loopimages);
    pos=validy(selectpoints,:)-validyfirst(selectpoints,:);
end
if y==1
    displ=validx(selectpoints,:);
end
if y==2
    displ=validy(selectpoints,:);
end
if y==3
    validxfirst=zeros(size(validx));
    validxfirst=validx(:,1)*ones(1,loopimages);
    displ=validx(selectpoints,:)-validxfirst(selectpoints,:);
end
if y==4
    validyfirst=zeros(size(validy));
    validyfirst=validy(:,1)*ones(1,loopimages);
    displ=validy(selectpoints,:)-validyfirst(selectpoints,:);
end

plot(pos(:,selectedimage),displ(:,selectedimage),'o','MarkerEdgeColor','k','MarkerFaceColor','r')
title(sprintf('Red dots represent your new raster.'))
hold off

% Do you want to keep the grid?
confirmselection = menu(sprintf('Do you want to use this raster?'),...
    'Yes','No, try again','Go back to raster-type selection');

if confirmselection==1
    rasterx=pos;
    rastery=displ;
    close all
end

if confirmselection==2
    rasterx=0;
    rastery=0;
    close all
    hold off
    exist('rasterx')
    exist('rastery')
    exist('x')
    exist('y')
    exist('validx')
    exist('validy')
    [validx,validy,rasterx, rastery,selectedimage,x,y]=rect_grid_displ(validx,validy,x,y,selectedimage,rasterx,rastery);
end

if confirmselection==3
    close all
    [rasterx,rastery,validx,validy,x,y]=gridtypeselection(validx,validy,x,y,selectedimage,rasterx,rastery);
end

Contact us at files@mathworks.com