image thumbnail

FingerPrint Application

by

 

05 Oct 2007 (Updated )

Capture the Minutiae from a fingerprint

FingerPrintGUI(varargin)
function varargout = FingerPrintGUI(varargin)
% FINGERPRINTGUI M-file for FingerPrintGUI.fig
%      FINGERPRINTGUI, by itself, creates a new FINGERPRINTGUI or raises the existing
%      singleton*.
%
%      H = FINGERPRINTGUI returns the handle to a new FINGERPRINTGUI or the handle to
%      the existing singleton*.
%
%      FINGERPRINTGUI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in FINGERPRINTGUI.M with the given input arguments.
%
%      FINGERPRINTGUI('Property','Value',...) creates a new FINGERPRINTGUI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before FingerPrintGUI_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to FingerPrintGUI_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help FingerPrintGUI

% Last Modified by GUIDE v2.5 20-Aug-2007 14:50:00

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @FingerPrintGUI_OpeningFcn, ...
                   'gui_OutputFcn',  @FingerPrintGUI_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before FingerPrintGUI is made visible.
function FingerPrintGUI_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to FingerPrintGUI (see VARARGIN)

% Choose default command line output for FingerPrintGUI
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes FingerPrintGUI wait for user response (see UIRESUME)
% uiwait(handles.FingerPrintGUI);
set(handles.Binarize,'enable','off');
set(handles.AutomaticBW,'enable','off');
set(handles.ManualBW,'enable','off');
set(handles.Thining,'enable','off');
set(handles.FindMinutia,'enable','off');
set(handles.RemoveFalseMinutia,'enable','off');
set(handles.RegionOfInterest,'enable','off');
set(handles.ManualROI,'enable','off');
set(handles.AutomaticROI,'enable','off');
set(handles.Orientation,'enable','off');
set(handles.Validation,'enable','off');
set(handles.OriginalImage,'enable','off');
set(handles.Skeleton,'enable','off');
set(handles.Termination,'enable','off');
set(handles.Bifurcation,'enable','off');
set(handles.ExportMinutia,'enable','off');


% --- Outputs from this function are returned to the command line.
function varargout = FingerPrintGUI_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in Skeleton.
function Skeleton_Callback(hObject, eventdata, handles)
% hObject    handle to Skeleton (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of Skeleton
if get(hObject,'value')==1
    set(handles.OriginalImage,'value',0)
    set(handles.WhiteImage,'value',0)
end

% --- Executes on button press in OriginalImage.
function OriginalImage_Callback(hObject, eventdata, handles)
% hObject    handle to OriginalImage (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of OriginalImage
if get(hObject,'value')==1
    set(handles.WhiteImage,'value',0)
    set(handles.Skeleton,'value',0)
end

% --- Executes on button press in WhiteImage.
function WhiteImage_Callback(hObject, eventdata, handles)
% hObject    handle to WhiteImage (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of WhiteImage
if get(hObject,'value')==1
    set(handles.OriginalImage,'value',0)
    set(handles.Skeleton,'value',0)
end



% --- Executes on button press in radiobutton7.
function radiobutton7_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton7 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of radiobutton7


% --- Executes on button press in Termination.
function Termination_Callback(hObject, eventdata, handles)
% hObject    handle to Termination (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of Termination


% --- Executes on button press in Bifurcation.
function Bifurcation_Callback(hObject, eventdata, handles)
% hObject    handle to Bifurcation (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of Bifurcation


% --- Executes on button press in Binarize.
function Binarize_Callback(hObject, eventdata, handles)
% hObject    handle to Binarize (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

I=getappdata(handles.FingerPrintGUI,'OriginalImage');
if get(handles.ManualBW,'value')==1
    Threshold=str2num(get(handles.Threshold,'string'));
    BinarizedImage=I(:,:,1)>Threshold;
else
    BinarizedImage=I(:,:,1)>160;
end

setappdata(handles.FingerPrintGUI,'BinarizedImage',BinarizedImage);

set(handles.Thining,'enable','on')

axes(handles.axes1)
image(255*BinarizedImage),colormap(gray)
set(gca,'tag','axes1')
function Threshold_Callback(hObject, eventdata, handles)
% hObject    handle to Threshold (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of Threshold as text
%        str2double(get(hObject,'String')) returns contents of Threshold as a double


% --- Executes during object creation, after setting all properties.
function Threshold_CreateFcn(hObject, eventdata, handles)
% hObject    handle to Threshold (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in RegionOfInterest.
function RegionOfInterest_Callback(hObject, eventdata, handles)
% hObject    handle to RegionOfInterest (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
I=getappdata(handles.FingerPrintGUI,'OriginalImage');
K=getappdata(handles.FingerPrintGUI,'Skeleton');

if get(handles.AutomaticROI,'value')==1
Kopen=imclose(K,strel('square',7));

KopenClean= imfill(Kopen,'holes');
KopenClean=bwareaopen(KopenClean,5);

KopenClean([1 end],:)=0;
KopenClean(:,[1 end])=0;
ROI=imerode(KopenClean,strel('disk',10));
elseif get(handles.ManualROI,'value')==1
    f=figure;
    ROI=roipoly(I);
    close(f)
else
    errordlg('Please, Select a Method');
end



%% Suppress extrema minutiae
% Once we defined the ROI, we can suppress minutiae external to this ROI.
CentroidFinX=getappdata(handles.FingerPrintGUI,'CentroidFinX');
CentroidFinY=getappdata(handles.FingerPrintGUI,'CentroidFinY');
CentroidSepX=getappdata(handles.FingerPrintGUI,'CentroidSepX');
CentroidSepY=getappdata(handles.FingerPrintGUI,'CentroidSepY');
[m,n]=size(I(:,:,1));
indFin=sub2ind([m,n],CentroidFinX,CentroidFinY);
Z=zeros(m,n);
Z(indFin)=1;
ZFin=Z.*ROI';
[CentroidFinX,CentroidFinY]=find(ZFin);

indSep=sub2ind([m,n],CentroidSepX,CentroidSepY);
Z=zeros(m,n);
Z(indSep)=1;
ZSep=Z.*ROI';
[CentroidSepX,CentroidSepY]=find(ZSep);


axes(handles.axes1)
imshow(I)
hold on
image(255*ROI)
alpha(0.5)
plot(CentroidFinX,CentroidFinY,'ro','linewidth',2)
plot(CentroidSepX,CentroidSepY,'go','linewidth',2)
hold off

set(gca,'tag','axes1')

setappdata(handles.FingerPrintGUI,'CentroidFinX',CentroidFinX);
setappdata(handles.FingerPrintGUI,'CentroidFinY',CentroidFinY);
setappdata(handles.FingerPrintGUI,'CentroidSepX',CentroidSepX);
setappdata(handles.FingerPrintGUI,'CentroidSepY',CentroidSepY);

set(handles.Orientation,'enable','on')


% --- Executes on button press in Thining.
function Thining_Callback(hObject, eventdata, handles)
% hObject    handle to Thining (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
I=getappdata(handles.FingerPrintGUI,'BinarizedImage');
Skeleton=bwmorph(~I,'thin','inf');

setappdata(handles.FingerPrintGUI,'Skeleton',Skeleton);

set(handles.Skeleton,'enable','on')
set(handles.FindMinutia,'enable','on')

axes(handles.axes1)
image(255*Skeleton)
set(gca,'tag','axes1')
% --- Executes on button press in FindMinutia.
function FindMinutia_Callback(hObject, eventdata, handles)
% hObject    handle to FindMinutia (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
I=getappdata(handles.FingerPrintGUI,'Skeleton');
axes(handles.axes1)
imshow(255*I)

fun=@minutie;
L = nlfilter(I,[3 3],fun);

%% Termination
LFin=(L==1);
LFinLab=bwlabel(LFin);
propFin=regionprops(LFinLab,'Centroid');
CentroidFin=round(cat(1,propFin(:).Centroid));
CentroidFinX=CentroidFin(:,1);
CentroidFinY=CentroidFin(:,2);
axes(handles.axes1)
hold on
plot(CentroidFinX,CentroidFinY,'ro')

%% Bifurcation
LSep=(L==3);
LSepLab=bwlabel(LSep);
propSep=regionprops(LSepLab,'Centroid','Image');
CentroidSep=round(cat(1,propSep(:).Centroid));
CentroidSepX=CentroidSep(:,1);
CentroidSepY=CentroidSep(:,2);
plot(CentroidSepX,CentroidSepY,'go')
hold off
set(gca,'tag','axes1')



setappdata(handles.FingerPrintGUI,'CentroidFinX',CentroidFinX);
setappdata(handles.FingerPrintGUI,'CentroidFinY',CentroidFinY);
setappdata(handles.FingerPrintGUI,'CentroidSepX',CentroidSepX);
setappdata(handles.FingerPrintGUI,'CentroidSepY',CentroidSepY);
setappdata(handles.FingerPrintGUI,'OrientationFin',[]);
setappdata(handles.FingerPrintGUI,'OrientationSep',[]);
set(handles.RemoveFalseMinutia,'enable','on')
set(handles.Termination,'enable','on')
set(handles.Bifurcation,'enable','on')
set(handles.ExportMinutia,'enable','on');




% --- Executes on button press in RemoveFalseMinutia.
function RemoveFalseMinutia_Callback(hObject, eventdata, handles)
% hObject    handle to RemoveFalseMinutia (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
CentroidFinX=getappdata(handles.FingerPrintGUI,'CentroidFinX');
CentroidFinY=getappdata(handles.FingerPrintGUI,'CentroidFinY');
CentroidSepX=getappdata(handles.FingerPrintGUI,'CentroidSepX');
CentroidSepY=getappdata(handles.FingerPrintGUI,'CentroidSepY');
D=6;
%% Process 1
Distance=DistEuclidian([CentroidSepX CentroidSepY],[CentroidFinX CentroidFinY]);
SpuriousMinutae=Distance<D;
[i,j]=find(SpuriousMinutae);
CentroidSepX(i)=[];
CentroidSepY(i)=[];
CentroidFinX(j)=[];
CentroidFinY(j)=[];
%% Process 2
Distance=DistEuclidian([CentroidSepX CentroidSepY]);
SpuriousMinutae=Distance<D;
[i,j]=find(SpuriousMinutae);
CentroidSepX(i)=[];
CentroidSepY(i)=[];

%% Process 3
Distance=DistEuclidian([CentroidFinX CentroidFinY]);
SpuriousMinutae=Distance<D;
[i,j]=find(SpuriousMinutae);
CentroidFinX(i)=[];
CentroidFinY(i)=[];


I=getappdata(handles.FingerPrintGUI,'Skeleton');
axes(handles.axes1)
imshow(255*I)
hold on
plot(CentroidFinX,CentroidFinY,'ro')
plot(CentroidSepX,CentroidSepY,'go')
hold off
set(gca,'tag','axes1')

setappdata(handles.FingerPrintGUI,'CentroidFinX',CentroidFinX);
setappdata(handles.FingerPrintGUI,'CentroidFinY',CentroidFinY);
setappdata(handles.FingerPrintGUI,'CentroidSepX',CentroidSepX);
setappdata(handles.FingerPrintGUI,'CentroidSepY',CentroidSepY);

set(handles.ManualROI,'enable','on')
set(handles.AutomaticROI,'enable','on')
set(handles.RegionOfInterest,'enable','on')
% --- Executes on button press in Orientation.
function Orientation_Callback(hObject, eventdata, handles)
% hObject    handle to Orientation (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
Table=[3*pi/4 2*pi/3 pi/2 pi/3 pi/4 
       5*pi/6 0 0 0 pi/6
       pi 0 0 0 0
      -5*pi/6 0 0 0 -pi/6
      -3*pi/4 -2*pi/3 -pi/2 -pi/3 -pi/4];
CentroidFinX=getappdata(handles.FingerPrintGUI,'CentroidFinX');
CentroidFinY=getappdata(handles.FingerPrintGUI,'CentroidFinY');
CentroidSepX=getappdata(handles.FingerPrintGUI,'CentroidSepX');
CentroidSepY=getappdata(handles.FingerPrintGUI,'CentroidSepY');
K=getappdata(handles.FingerPrintGUI,'Skeleton');
%% Termination Orientation 
% We have to find the orientation of the termination. 
% For finding that, we analyze the position of the pixel on the boundary of
% a 5 x 5 bounding box of the termination. We compare this position to the
% Table variable. The Table variable gives the angle in radian.
for ind=1:length(CentroidFinX)
    Klocal=K(CentroidFinY(ind)-2:CentroidFinY(ind)+2,CentroidFinX(ind)-2:CentroidFinX(ind)+2);
    Klocal(2:end-1,2:end-1)=0;
    [i,j]=find(Klocal);
    if length(i)~=1
        CentroidFinY(ind)=NaN;
        CentroidFinX(ind)=NaN;
        OrientationFin(ind,1)=NaN;
    else
        OrientationFin(ind,1)=Table(i,j);
    end
end
dxFin=sin(OrientationFin)*5;
dyFin=cos(OrientationFin)*5;
axes(handles.axes1)
imshow(K)
hold on
plot(CentroidFinX,CentroidFinY,'ro','linewidth',2)
plot([CentroidFinX CentroidFinX+dyFin]',...
    [CentroidFinY CentroidFinY-dxFin]','r','linewidth',2)


%% Bifurcation Orientation
%  For each bifurcation, we have three lines. So we operate the same
%  process than in termination case three times.
for ind=1:length(CentroidSepX)
    Klocal=K(CentroidSepY(ind)-2:CentroidSepY(ind)+2,CentroidSepX(ind)-2:CentroidSepX(ind)+2);
    Klocal(2:end-1,2:end-1)=0;
    [i,j]=find(Klocal);
    if length(i)~=3
        CentroidSepY(ind)=NaN;
        CentroidSepX(ind)=NaN;
        OrientationSep(ind)=NaN;
    else
        for k=1:3
            OrientationSep(ind,k)=Table(i(k),j(k));
            dxSep(ind,k)=sin(OrientationSep(ind,k))*5;
            dySep(ind,k)=cos(OrientationSep(ind,k))*5;

        end
    end
end

plot(CentroidSepX,CentroidSepY,'go','linewidth',2)
OrientationLinesX=[CentroidSepX CentroidSepX+dySep(:,1);CentroidSepX CentroidSepX+dySep(:,2);CentroidSepX CentroidSepX+dySep(:,3)]';
OrientationLinesY=[CentroidSepY CentroidSepY-dxSep(:,1);CentroidSepY CentroidSepY-dxSep(:,2);CentroidSepY CentroidSepY-dxSep(:,3)]';
plot(OrientationLinesX,OrientationLinesY,'g','linewidth',2)
hold off
set(gca,'tag','axes1')
setappdata(handles.FingerPrintGUI,'CentroidFinX',CentroidFinX);
setappdata(handles.FingerPrintGUI,'CentroidFinY',CentroidFinY);
setappdata(handles.FingerPrintGUI,'CentroidSepX',CentroidSepX);
setappdata(handles.FingerPrintGUI,'CentroidSepY',CentroidSepY);
setappdata(handles.FingerPrintGUI,'OrientationFin',OrientationFin);
setappdata(handles.FingerPrintGUI,'OrientationSep',OrientationSep);

set(handles.Validation,'enable','on')
% --- Executes on button press in Validation.
function Validation_Callback(hObject, eventdata, handles)
% hObject    handle to Validation (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

CentroidFinX=getappdata(handles.FingerPrintGUI,'CentroidFinX');
CentroidFinY=getappdata(handles.FingerPrintGUI,'CentroidFinY');
CentroidSepX=getappdata(handles.FingerPrintGUI,'CentroidSepX');
CentroidSepY=getappdata(handles.FingerPrintGUI,'CentroidSepY');
OrientationFin=getappdata(handles.FingerPrintGUI,'OrientationFin');
OrientationSep=getappdata(handles.FingerPrintGUI,'OrientationSep');
I=getappdata(handles.FingerPrintGUI,'OriginalImage');
ValidationGUI(I,CentroidFinX,CentroidFinY,OrientationFin,CentroidSepX,CentroidSepY,OrientationSep);

% --------------------------------------------------------------------
function LoadImage_Callback(hObject, eventdata, handles)
% hObject    handle to LoadImage (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

[f,rep]=uigetfile('*.bmp');
OriginalImage=imread([rep,f]);
OriginalImage=imresize(OriginalImage,[300 300]);
set(handles.OriginalImage,'enable','on');
set(handles.Display,'enable','on');
set(handles.AutomaticBW,'enable','on');
set(handles.ManualBW,'enable','on');
set(handles.Binarize,'enable','on');
set(handles.OriginalImage,'value',1);
setappdata(handles.FingerPrintGUI,'OriginalImage',OriginalImage);

Display_Callback(handles.Display,eventdata,handles);

% --------------------------------------------------------------------
function ExportMinutia_Callback(hObject, eventdata, handles)
% hObject    handle to ExportMinutia (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
CentroidSepX=getappdata(handles.FingerPrintGUI,'CentroidSepX');
CentroidSepY=getappdata(handles.FingerPrintGUI,'CentroidSepY');
OrientationSep=getappdata(handles.FingerPrintGUI,'OrientationSep');
MinutiaSep=[CentroidSepX CentroidSepY OrientationSep];
CentroidFinX=getappdata(handles.FingerPrintGUI,'CentroidFinX');
CentroidFinY=getappdata(handles.FingerPrintGUI,'CentroidFinY');
OrientationFin=getappdata(handles.FingerPrintGUI,'OrientationFin');
MinutiaFin=[CentroidFinX CentroidFinY OrientationFin];
prompt = {'Enter file name:'};
dlg_title = 'Input for Minutia export';
num_lines = 1;
def = {'John Doe'};
answer = inputdlg(prompt,dlg_title,num_lines,def);
saveMinutia(answer{1},MinutiaFin,MinutiaSep);

% --------------------------------------------------------------------
function Untitled_1_Callback(hObject, eventdata, handles)
% hObject    handle to Untitled_1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --- Executes on button press in Display.
function Display_Callback(hObject, eventdata, handles)
% hObject    handle to Display (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
axes(handles.axes2)
g1=get(handles.OriginalImage,'value');
g3=get(handles.Skeleton,'value');
if g1==1
    image(getappdata(handles.FingerPrintGUI,'OriginalImage'));
elseif g3==1
    image(255*getappdata(handles.FingerPrintGUI,'Skeleton'));
else
    image(ones(200,200,3));
end


hold on
h1=get(handles.Termination,'value');
h2=get(handles.Bifurcation,'value');
if h1==1
    CentroidFinX=getappdata(handles.FingerPrintGUI,'CentroidFinX');
    CentroidFinY=getappdata(handles.FingerPrintGUI,'CentroidFinY');
    plot(CentroidFinX,CentroidFinY,'ro','linewidth',2)
    OrientationFin=getappdata(handles.FingerPrintGUI,'OrientationFin');
    length(OrientationFin)
    if ~isempty(OrientationFin)

        dxFin=sin(OrientationFin)*5;
        dyFin=cos(OrientationFin)*5;
        hold on

        plot([CentroidFinX CentroidFinX+dyFin]',...
            [CentroidFinY CentroidFinY-dxFin]','r','linewidth',2)
    end
end
if h2==1
    CentroidSepX=getappdata(handles.FingerPrintGUI,'CentroidSepX');
    CentroidSepY=getappdata(handles.FingerPrintGUI,'CentroidSepY');
    plot(CentroidSepX,CentroidSepY,'go','linewidth',2)
    OrientationSep=getappdata(handles.FingerPrintGUI,'OrientationSep');
    if ~isempty(OrientationSep)
        dxSep=sin(OrientationSep)*5;
        dySep=cos(OrientationSep)*5;
        OrientationLinesX=[CentroidSepX CentroidSepX+dySep(:,1);CentroidSepX CentroidSepX+dySep(:,2);CentroidSepX CentroidSepX+dySep(:,3)]';
        OrientationLinesY=[CentroidSepY CentroidSepY-dxSep(:,1);CentroidSepY CentroidSepY-dxSep(:,2);CentroidSepY CentroidSepY-dxSep(:,3)]';

        plot(OrientationLinesX,OrientationLinesY,'g','linewidth',2)
    end
end
hold off
set(gca,'tag','axes2')



function edit2_Callback(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit2 as text
%        str2double(get(hObject,'String')) returns contents of edit2 as a double


% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

Contact us