% Copyright or © or Copr. CREATIS laboratory, Lyon, France.
%
% Contributor: Olivier Bernard, Associate Professor at the french
% engineering university INSA (Institut National des Sciences Appliquees)
% and a member of the CREATIS-LRMN laboratory (CNRS 5220, INSERM U630,
% INSA, Claude Bernard Lyon 1 University) in France (Lyon).
%
% Date of creation: 8th of October 2009
%
% E-mail of the author: olivier.bernard@creatis.insa-lyon.fr
%
% This software is a computer program whose purpose is to evaluate the
% performance of different level-set based segmentation algorithms in the
% context of image processing (and more particularly on biomedical
% images).
%
% The software has been designed for two main purposes.
% - firstly, CREASEG allows you to use six different level-set methods.
% These methods have been chosen in order to work with a wide range of
% level-sets. You can select for instance classical methods such as
% Caselles or Chan & Vese level-set, or more recent approaches such as the
% one developped by Lankton or Bernard.
% - finally, the software allows you to compare the performance of the six
% level-set methods on different images. The performance can be evaluated
% either visually, or from measurements (either using the Dice coefficient
% or the PSNR value) between a reference and the results of the
% segmentation.
%
% The level-set segmentation platform is citationware. If you are
% publishing any work, where this program has been used, or which used one
% of the proposed level-set algorithms, please remember that it was
% obtained free of charge. You must reference the papers shown below and
% the name of the CREASEG software must be mentioned in the publication.
%
% CREASEG software
% "T. Dietenbeck, M. Alessandrini, D. Friboulet, O. Bernard. CREASEG: a
% free software for the evaluation of image segmentation algorithms based
% on level-set. In IEEE International Conference On Image Processing.
% Hong Kong, China, 2010."
%
% Bernard method
% "O. Bernard, D. Friboulet, P. Thevenaz, M. Unser. Variational B-Spline
% Level-Set: A Linear Filtering Approach for Fast Deformable Model
% Evolution. In IEEE Transactions on Image Processing. volume 18, no. 06,
% pp. 1179-1191, 2009."
%
% Caselles method
% "V. Caselles, R. Kimmel, and G. Sapiro. Geodesic active contours.
% International Journal of Computer Vision, volume 22, pp. 61-79, 1997."
%
% Chan & Vese method
% "T. Chan and L. Vese. Active contours without edges. IEEE Transactions on
% Image Processing. volume10, pp. 266-277, February 2001."
%
% Lankton method
% "S. Lankton, A. Tannenbaum. Localizing Region-Based Active Contours. In
% IEEE Transactions on Image Processing. volume 17, no. 11, pp. 2029-2039,
% 2008."
%
% Li method
% "C. Li, C.Y. Kao, J.C. Gore, Z. Ding. Minimization of Region-Scalable
% Fitting Energy for Image Segmentation. In IEEE Transactions on Image
% Processing. volume 17, no. 10, pp. 1940-1949, 2008."
%
% Shi method
% "Yonggang Shi, William Clem Karl. A Real-Time Algorithm for the
% Approximation of Level-Set-Based Curve Evolution. In IEEE Transactions
% on Image Processing. volume 17, no. 05, pp. 645-656, 2008."
%
% This software is governed by the BSD license and
% abiding by the rules of distribution of free software.
%
% As a counterpart to the access to the source code and rights to copy,
% modify and redistribute granted by the license, users are provided only
% with a limited warranty and the software's author, the holder of the
% economic rights, and the successive licensors have only limited
% liability.
%
% In this respect, the user's attention is drawn to the risks associated
% with loading, using, modifying and/or developing or reproducing the
% software by the user in light of its specific status of free software,
% that may mean that it is complicated to manipulate, and that also
% therefore means that it is reserved for developers and experienced
% professionals having in-depth computer knowledge. Users are therefore
% encouraged to load and test the software's suitability as regards their
% requirements in conditions enabling the security of their systems and/or
% data to be ensured and, more generally, to use and operate it in the
% same conditions as regards security.
%
%------------------------------------------------------------------------
function creaseg_drawMultiManualContours(src,evt)
%-- get structures
fig = findobj(0,'tag','creaseg');
ud = get(fig,'userdata');
fd = get(ud.imageId,'userdata');
pos = floor(get(ud.gca(1),'CurrentPoint'));
if ~( pos(1,1) < size(fd.data,2) && pos(1,1) > 1 && pos(1,2) < size(fd.data,1) && pos(1,2) >1 )
return; %Clic outside the image => do nothing
end
if ( strcmp(get(ud.gcf,'SelectionType'),'normal') )
%-- Set drawingMultiManualFlag flag to 1
fd.drawingMultiManualFlag = 1;
%-- disable run and pointer buttons
set(ud.buttonAction(2),'enable','off');
set(ud.buttonAction(3),'enable','off');
%-- delete any overlay lines
if ( size(fd.handleManual,2)>0 )
for k=1:size(fd.handleManual{end},1)
if ( fd.handleManual{end}(k) ~= 0 )
delete(fd.handleManual{end}(k));
end
end
else
fd.handleManual{1} = 0;
end
%-- Get point coordinates
pt = get(ud.gca,'CurrentPoint');
pt = pt(1,1:2);
if (isempty(fd.points))
fd.points = [pt(1),pt(2)];
hold on; h = plot(pt(1), pt(2), 'oy', 'linewidth', 2);
fd.handleManual{end} = h;
else
fd.points(end+1,:) = [pt(1),pt(2)];
color = ud.colorSpec(get(ud.handleContourColor,'userdata'));
if length(fd.points(:,1)) < 3
hold on; h1 = plot(fd.points(:,1),fd.points(:,2),'--','color',color{1},'Linewidth',2);
tmp = fd.points(1,:); tmp(end+1,:) = fd.points(end,:);
h2 = plot(tmp(:,1), tmp(:,2), 'y--', 'linewidth', 2);
else
[xs, ys] = creaseg_spline(fd.points(:,1)',fd.points(:,2)');
fin = find((xs == fd.points(end,1)) & (ys == fd.points(end,2)) );
deb = find((xs == fd.points(1,1)) & (ys == fd.points(1,2)) );
xs = xs([deb:end, 1:deb]); ys = ys([deb:end, 1:deb]);
if deb > fin
idx = length(xs) + fin - deb;
else
idx = fin - deb;
end
clear deb fin;
hold on; h1 = plot(xs(1:idx),ys(1:idx),'--','color',color{1},'Linewidth',2);
hold on; h2 = plot(xs(idx:end),ys(idx:end),'y--','Linewidth',2);
end
h3 = plot(fd.points(:,1), fd.points(:,2), 'oy', 'linewidth', 2);
hold off;
fd.handleManual{end} = [h1;h2;h3];
end
else %-- create final contour
%-- Set drawingMultiManualFlag flag to 1
fd.drawingMultiManualFlag = 1;
%-- enable run and pointer buttons
set(ud.buttonAction(2),'enable','on');
set(ud.buttonAction(3),'enable','on');
set(ud.buttonAction(6),'enable','on');
%-- display final contour
if ( size(fd.points,1)>2 )
%-- delete any overlay lines
if ( size(fd.handleManual,2)>0 )
for k=1:size(fd.handleManual{end},1)
delete(fd.handleManual{end}(k));
end
end
%--
color = ud.colorSpec(get(ud.handleContourColor,'userdata'));
if length(fd.points(:,1)) < 3
tmp = fd.points;
tmp(end+1,:) = tmp(1,:);
hold on; h = plot(tmp(:,1),tmp(:,2),'--','color',color{1},'Linewidth',2);
else
[xs, ys] = creaseg_spline(fd.points(:,1)',fd.points(:,2)');
hold on; h = plot(xs,ys,'--','color',color{1},'Linewidth',2);
end
fd.handleManual{end} = h;
%-- create manual mask
X = get(fd.handleManual{end},'X');
Y = get(fd.handleManual{end},'Y');
fd.levelset = xor(roipoly(fd.data,X,Y),fd.levelset);
%-- save initialization info
ud.LastPlot = 'levelset';
fd.method = 'Initial region';
%-- prepare next contour
fd.handleManual{end+1} = 0;
end
fd.points = [];
end
%-- save structure
set(ud.imageId,'userdata',fd);
set(ud.gcf,'userdata',ud);