www.pudn.com > ms_segmenter.rar > Segment_demo.asv
function Segment_demo (Action, Arguments, varargin)
global All_vars Biomed_on;
if size(All_vars, 2) > 0
eval (['global ', All_vars]);
end
% regions are represented as structures of:
% private chars:
% Number - region number
% Color - the original color to draw the region
% Line - the actual points as a line object
% Active - whether it was merged into another region
% From - which regions it was obtained from (by merging or cutting)
% public chars:
% Boundary (Boundary) given as set of points
% Area - total area of the regions, since computed anyway
% Inner point - telling where the interior of region is (Inner_pts)
% Shifts - a matrix of size 2 by 2 giving min, max x and y vals for boundary
% Region_matr - the filled with pixels boundary for various operations
% user defined chars:
if nargin < 1
warning off;
Common_vars =[' Gray_image Image Luv_image Image_is_gray ', ...
' Region_colors Bndred_regions Curr_pt Curr_pt_line ',...
' Slices Centers Store_mouse_pts ', ...
' Regions Region_menu_added Min_region_size ', ...
' Region_menu Main_figure Main_axis Marker_size ', ...
' Region_left Region_right Show_all_regions ', ...
' Instance Active_instances Biomed_on '];
Biomed_vars = [' Amnt_rot Window_regs_chosen Window1 Window2 '];
All_vars = [Common_vars, Biomed_vars];
eval (['global ', All_vars]);
Action = 'Initialize';
end
if strcmp(Action, 'Initialize')
if nargin < 2 % the very first call to it
Msg_box_hndl = msgbox('Welcome to the system ...', 'Welcome');
Child = get(Msg_box_hndl, 'Children'); % the OK button
set(Child(length(Child)), 'Style', 'Text', 'String', '');
Image_menu = uimenu(Msg_box_hndl, 'Label','&Image');
uimenu(Image_menu, 'Label', '&Open...', ...
'Callback', 'close; Segment_demo(''Read image'')', 'Accelerator', 'O');
uimenu(Image_menu, 'Label', '&Quit', ...
'Callback', 'close', 'Separator','on', 'Accelerator', 'Q');
Screen_size = get(0, 'ScreenSize');
Marker_size = round(max(Screen_size)/200);
else
I = varargin{length(varargin)}; % last argument always
if length(size(Arguments)) == 3 % color image
Image_is_gray{I} = 0;
Image{I} = Arguments;
else
Image_is_gray{I} = 1;
Image{I} = Arguments;
Gray_image{I} = double(Arguments);
end
if not(varargin{1}) % does not need new window
Kids = get(Main_axis{I}, 'Children');
for i=1:length(Kids)
if strcmp(get(Kids(i), 'Type'), 'line')
set(Kids(i), 'XData', 0, 'YData', 0, 'Visible', 'off');
end
end
Segment_demo('Refresh image', 0, I);
end
Regions{I} = {};
Bndred_regions{I} = 0;
Region_left{I} = 0; Region_right{I} = 0;
Store_mouse_pts{I} = 0; Curr_pt_line{I} = 0;
Show_all_regions{I} = 0; % will show only active regions by default
% Biomed vars go here
if Instance == 1
Window_regs_chosen = 0;
end
Amnt_rot{I} = 8;
% the list of colors
Region_colors{1, 1} = 'magenta';
Region_colors{1, 2} = 'yellow';
Region_colors{1, 3} = 'green';
Region_colors{1, 4} = 'red';
Region_colors{1, 5} = 'cyan';
Region_colors{1, 6} = 'blue';
Region_colors{1, 7} = 'black';
if varargin{1} % needs new window
Region_menu_added{I} = 0;
ButtonDown = sprintf('Segment_demo(''%s'',%d,%d)', 'Down', 0, I);
CloseReq = sprintf('Segment_demo(''%s'',%d,%d)', 'Exit', 0, I);
set(gcf, 'WindowButtonDownFcn', ButtonDown, 'MenuBar', 'none', ...
'CloseRequestFcn', CloseReq);
Main_figure{I} = gcf;
Main_axis{I} = gca;
Image_menu = uimenu('Label','&Image');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Read image', 0, I);
uimenu(Image_menu, 'Label', '&Open...', ...
'Callback', Callback, 'Accelerator', 'O');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Smooth prompt', 0, I);
uimenu(Image_menu, 'Label', 's&Mooth...', ...
'Callback', Callback, 'Accelerator', 'M');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Segment prompt', 0, I);
uimenu(Image_menu, 'Label', 'se&Gment...', ...
'Callback', Callback, 'Accelerator', 'G');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Crop', 0, I);
uimenu(Image_menu, 'Label', '&Crop...', ...
'Callback', Callback, 'Accelerator', 'C');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Refresh image', 0, I);
uimenu(Image_menu, 'Label', 'r&Efresh!', ...
'Callback', Callback, 'Accelerator', 'E');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Label prompt', 0, I);
uimenu(Image_menu, 'Label', 'l&abel', ...
'Callback', Callback, 'Accelerator', 'A');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Save image', 0, I);
uimenu(Image_menu, 'Label', '&Save as...', ...
'Callback', Callback, 'Accelerator', 'S');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Exit', 0, I);
uimenu(Image_menu, 'Label', '&Quit', ...
'Callback', Callback, 'Separator','on', 'Accelerator', 'Q');
Segment_demo('Show image', 1, I); % needs window size setting
else
Segment_demo('Show image', 0, I); % no window size setting
end
end
end
%-----------------------------------------
% exiting if desired, after warning
if strcmp(Action, 'Exit')
I = varargin{length(varargin)}; % last argument always
set(Main_figure{I}, 'CloseRequestFcn', 'closereq');
close;
Active_instances = Active_instances-1;
if Active_instances == 0
eval (['clear global ', All_vars]);
end
%-----------------------------------------
% keeping track of the pixel clicked onto by mouse
elseif strcmp(Action, 'Down') % request to pick region follows
I = varargin{length(varargin)}; % last argument always
Curr_pt_get{I} = get(gca, 'CurrentPoint');
Curr_pt_get{I} = round(Curr_pt_get{I}(1, 1:2));
Curr_pt_get{I} = [Curr_pt_get{I}(2); Curr_pt_get{I}(1)]; % switching x and y
if Store_mouse_pts{I}
Curr_pt{I} = [Curr_pt{I}, Curr_pt_get{I}];
else
Curr_pt{I} = Curr_pt_get{I};
end
if Curr_pt_line{I}
set(Curr_pt_line{I}, 'XData',Curr_pt{I}(2, :), 'YData',Curr_pt{I}(1, :));
else
Curr_pt_line{I} = ...
line('XData', Curr_pt{I}(2, :), 'YData', Curr_pt{I}(1, :), ...
'Marker', '.', 'Color', 'yellow', 'EraseMode', 'none');
end
%-----------------------------------------
% segmenting the image into a number of subregions by the subroutine
elseif strcmp(Action, 'Segment prompt')
I = varargin{length(varargin)}; % last argument always
Prompt = {...
'Window size (small window => small variation)', ...
'Color components to use (fewer => quicker)', ...
'Color group size (small size => fewer colors left)', ...
'Min region size (small size => more small regions)', ...
'Would you like to see separate layers?'};
if Image_is_gray{I}
Default = {20, 1, 200, 20, 'No'};
else
Default = {30, 2, 200, 20, 'No'};
end
Title = 'Segmentation parameters';
Line_number = 1;
Segment_input = My_inputdlg(Prompt, Title, Line_number, Default);
if size(Segment_input, 2) > 0
Segment_demo ('Initialize', Image{I}, 0, I); % does not need new wind
Segment_demo ('Segment', Segment_input, I);
end
%-----------------------------------------
% segmenting the image into a number of subregions by the subroutine
elseif strcmp(Action, 'Segment')
I = varargin{length(varargin)}; % last argument always
Segment_input = Arguments;
Window_radius = base2dec(Segment_input{1}, 10);
Components = base2dec(Segment_input{2}, 10);
% Components = round(max(Components, 2)); % for a while
Color_group = base2dec(Segment_input{3}, 10);
Min_region_size{I} = base2dec(Segment_input{4}, 10);
Plot_slices = length(findstr(lower(Segment_input{5}), 'y'));
if Image_is_gray{I}
[Segmented, Centers] = ...
Gray_segment (Gray_image{I}, Window_radius, Color_group);
else
Luv_image{I} = Rgb_to_luv(Image{I}, 'Image');
Gray_image{I} = squeeze(Luv_image{I}(:, :, 1));
Lhs = '[Segmented, Centers] = ';
Rhs = [sprintf('Color_segment_svd%d', Components), ...
'(Luv_image{I}, Window_radius, Color_group);'];
eval([Lhs, Rhs]);
end
Segments = size(Centers, 2);
Slices{I} = zeros(size(Gray_image{I}));
if Plot_slices
figure; % plotting the resulting regions
Square_side = ceil(sqrt(Segments));
end
for i=1:Segments
Slice = (Segmented == i);
% some image processing - taken from morphology file
Slice = bwmorph(Slice, 'majority');
Slice = (Slice == 0); % negation
Slice = bwmorph(Slice, 'majority');
Slice = (Slice == 0); % negation
% Slice = bwmorph(Slice, 'thicken', 2); % no thickening for a while
Slices{I}(:, :, i) = bwlabel(Slice);
if Plot_slices
subplot(Square_side, Square_side, i);
image((Slices{I}(:, :, i)>0)*255); axis off;
colormap(gray(255));
end
end
if Plot_slices
figure(Main_figure{I});
end
% appending the new submenu
if not(Region_menu_added{I})
Region_menu{I} = uimenu('Label', '&Region');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Find boundary', 0, I);
uimenu(Region_menu{I}, 'Label', '&Find boundary', ...
'Callback', Callback, 'Accelerator', 'F');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Select left region', 0, I);
uimenu(Region_menu{I}, 'Label', '(un)select &1-st region', 'Enable', 'off', ...
'Callback', Callback, 'Accelerator', '1');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Select right region', 0, I);
uimenu(Region_menu{I}, 'Label', '(un)select &2-nd region', 'Enable', 'off', ...
'Callback', Callback, 'Accelerator', '2');
Callback=sprintf('Segment_demo(''%s'',%d,%d)','Save boundary prompt',0,I);
uimenu(Region_menu{I}, 'Label', 'sa&Ve as...', 'Enable', 'off', ...
'Callback', Callback, 'Accelerator', 'V');
Compare_menu = uimenu(Region_menu{I}, 'Label', '&Compare to...', ...
'Enable', 'off');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', ...
'Compare disk regions prompt', 0, I);
uimenu(Compare_menu, 'Label', '&Disk region...', ...
'Callback', Callback, 'Accelerator', 'D');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', ...
'Compare image regions prompt', 0, I);
uimenu(Compare_menu, 'Label', '&Image region...', ...
'Callback', Callback, 'Accelerator', 'I');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', ...
'Compare window regions prompt', 0, I);
uimenu(Compare_menu, 'Label', '&Window region...', ...
'Callback', Callback, 'Accelerator', 'W');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Merge prompt', 0, I);
uimenu(Region_menu{I}, 'Label', 'me&Rge...', 'Enable', 'off', ...
'Callback', Callback, 'Accelerator', 'R');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Cut prompt', 0, I);
uimenu(Region_menu{I}, 'Label', 'c&Ut...', 'Enable', 'off', ...
'Callback', Callback, 'Accelerator', 'U');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', ...
'Intensity 3-d prompt', 0, I);
uimenu(Region_menu{I},'Label', 'intensity &3-d...', 'Enable','off', ...
'Callback', Callback, 'Accelerator', '3');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', ...
'Background region prompt',0, I);
uimenu(Region_menu{I}, 'Label', 'bac&Kground...', 'Enable', 'off', ...
'Callback', Callback, 'Accelerator', 'K');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Color prompt', 0, I);
uimenu(Region_menu{I}, 'Label', 'co&Lor...', 'Enable', 'off', ...
'Callback', Callback, 'Accelerator', 'L');
Callback=sprintf('global Marker_size; Marker_size = Marker_size + 2;');
uimenu(Region_menu{I}, 'Label', 'Thicken next line', 'Enable', 'off', ...
'Callback', Callback);
Callback=sprintf('global Marker_size; Marker_size = Marker_size - 2;');
uimenu(Region_menu{I}, 'Label', 'Thin next line', 'Enable', 'off', ...
'Callback', Callback);
Region_menu_added{I} = 1;
end
%-----------------------------------------
elseif strcmp(Action, 'Crop')
I = varargin{length(varargin)}; % last argument always
msgbox('Please crop a subregion', 'Cropping');
waitforbuttonpress;
Point1 = get(gca,'CurrentPoint'); % button down detected
Final_rect = rbbox; % return Figure units
Point2 = get(gca,'CurrentPoint'); % button up detected
Point1 = round(Point1(1,1:2)); % extract x and y
Point2 = round(Point2(1,1:2));
P1 = min(Point1,Point2); % calculate locations
Offset = abs(Point1-Point2); % and dimensions
Rect_x = [P1(1) P1(1)+Offset(1) P1(1)+Offset(1) P1(1) P1(1)];
Rect_y = [P1(2) P1(2) P1(2)+Offset(2) P1(2)+Offset(2) P1(2)];
hold on;
axis manual;
plot(Rect_x, Rect_y);
Button = questdlg('Is it suitable?', 'Crop/Undo cropping','Yes','No','Yes');
if strcmp(Button,'Yes')
Left_x = min(Rect_y); Right_x = max(Rect_y); % again shift
Low_y = min(Rect_x); High_y = max(Rect_x); % again shift
if Image_is_gray{I}
Image_cropped = Gray_image{I}(Left_x:Right_x, Low_y:High_y);
else
Image_cropped = Image{I}(Left_x:Right_x, Low_y:High_y, :);
end
% creating a window for the newly cropped image
figure; % creating one more window
set (gcf, 'Name', [get(Main_figure{I}, 'Name'), ' cropped']);
if length(Instance) > 0 % was defined
Instance = Instance+1;
Active_instances = Active_instances+1;
else
Instance = 1;
Active_instances = 1;
end
Segment_demo ('Initialize', Image_cropped, 1, Instance); %needs new window
else
Segment_demo('Refresh image', 0, I);
end
%-----------------------------------------
elseif strcmp(Action, 'Smooth prompt')
I = varargin{length(varargin)}; % last argument always
Scr_sz = get(0, 'ScreenSize');
New_wind = dialog('Name', 'Which filter to use?', 'Position', ...
[Scr_sz(3)*0.3 Scr_sz(4)*0.4 Scr_sz(3)*0.3 Scr_sz(4)*0.1]);
Choice = uicontrol('Parent', New_wind);
Callback = sprintf('Segment_demo(''Smooth'', %18.16f, %d)', Choice, I);
set(Choice, 'Style', 'Popup', ...
'String', {'Circle-5', 'Symlet', 'Avg-3'}, ...
'Units', 'Normalized', 'Position', [0 0.5 1 0.5]);
Cancel_button = uicontrol('Parent', New_wind, ...
'String', 'Cancel', 'Style', 'Pushbutton', 'Callback', 'close', ...
'Units', 'Normalized', 'Position', [0.6 0.3 0.3 0.4]);
Ok_button = uicontrol('Parent', New_wind, ...
'String', 'OK', 'Style', 'Pushbutton', 'Callback', Callback, ...
'Units', 'Normalized', 'Position', [0.1 0.3 0.3 0.4]);
%----------------------------------------
elseif strcmp(Action, 'Smooth')
I = varargin{length(varargin)}; % last argument always
Choice = get(Arguments, 'Value');
close; % closing the prompt window
switch Choice
case 2
Filter = 'Symlets';
case 3
Filter = ones(3);
Filter = Filter/sum(sum(Filter));
case 1
Filter = ones(5);
Filter(1:2, 1) = zeros(2, 1); Filter(4:5, 1) = zeros(2, 1);
Filter(1:2, 5) = zeros(2, 1); Filter(4:5, 5) = zeros(2, 1);
Filter(1, 2) = 0; Filter(5, 2) = 0;
Filter(2, 5) = 0; Filter(5, 4) = 0;
Filter = Filter/sum(sum(Filter));
otherwise
Filter = 1;
end
if size(Filter, 2) > 1
if strcmp(Filter, 'Symlets')
if Image_is_gray{I}
Image_filtered = Smooth_wv(Gray_image{I});
else
for i=1:3
Image_filtered(:, :, i) = Smooth_wv(Image{I}(:, :, i));
end
end
else
if Image_is_gray{I}
Image_filtered = filter2(Filter, Gray_image{I});
else
for i=1:3
Image_filtered(:, :, i) = filter2(Filter, Image{I}(:, :, i));
end
end
end
Segment_demo ('Initialize', Image_filtered, 0, I); % no new window
end
%-----------------------------------------
% now saves both in low-quality and high quality formats in jpeg/tif/bmp and
% in eps format with a standard size
elseif strcmp(Action, 'Save image')
I = varargin{length(varargin)}; % last argument always
% Filter = '*.jpeg; *.jpg; *.tif; *.tiff; *.bmp; *.eps; *.ps';
Filter = '*.jpeg; *.jpg; *.tif; *.bmp; *.eps';
[File_name, Path_name] = uiputfile(Filter, 'Save to file ...');
[Screen, Screen_map] = capture(Main_figure{I});
% splitting file name into extension and file itself
for i=length(File_name):-1:1
if File_name(i) == '.'
File_type = File_name(i+1:length(File_name));
File_name = File_name(1:i-1);
break;
end
end
if File_name(1) > 0
if (strcmp(File_type, 'jpeg') | strcmp(File_type, 'jpg'))
% low-level file first
imwrite(Screen, Screen_map, [Path_name, File_name, '_low.', File_type], ...
File_type, 'Quality', 80);
print_string = sprintf('%s %s', 'print -djpeg ', ...
[Path_name, File_name, '_high.', File_type]);
eval(print_string);
msgbox(['Image was saved in ', File_name, '_low.', File_type, ...
' and ', File_name, '_high.', File_type], 'Files saved');
end
if (strcmp(File_type, 'tiff') | strcmp(File_type, 'tif'))
% low-level file first
imwrite(Screen, Screen_map, [Path_name, File_name, '_low.', File_type], ...
File_type);
print_string = sprintf('%s %s', 'print -dtiff ', ...
[Path_name, File_name, '_high.', File_type]);
eval(print_string);
msgbox(['Image was saved in ', File_name, '_low.', File_type, ...
' and ', File_name, '_high.', File_type], 'Files saved');
end
if strcmp(File_type, 'bmp')
% low-level file first
imwrite(Screen, Screen_map, [Path_name, File_name, '.', File_type], ...
File_type);
print_string = sprintf('%s %s', 'print -djpeg ', ...
[Path_name, File_name, '.jpg']);
eval(print_string);
msgbox(['Image was saved in ', File_name, '.', File_type, ...
' and ', File_name, '.jpg'], 'Files saved');
end
if (strcmp(File_type, 'eps') | strcmp(File_type, 'ps'))
print_string = sprintf('%s %s', 'print -depsc -loose ', ...
[Path_name, File_name, '.', File_type]);
eval(print_string);
msgbox(['Image was saved in ', File_name, '.', File_type], ...
'Files saved');
end
end
%-----------------------------------------
elseif strcmp(Action, 'Read image')
Filter = '*.jpeg; *.jpg; *.tif; *.tiff; *.bmp';
[File_name, Path_name] = uigetfile(Filter, 'Open file');
Image_name = File_name;
File_name = [Path_name, File_name];
if File_name(1) > 0 % not zeros there
[Im_read, Map] = imread(File_name);
if length(Map) > 0 % not gray or RGB, but could be made such
Im_read = ind2rgb(Im_read, Map);
Im_read = 256*Im_read;
end
Im_read = double(Im_read);
if length(size(Im_read)) == 3 % color image
for i=1:3
Img(:,:,i) = min(Im_read(:,:,i)+ones(size(Im_read(:,:,i))), ...
255*ones(size(Im_read(:,:,i))));
end
else
Img = min(Im_read+ones(size(Im_read)),255*ones(size(Im_read)));
end
figure; % creating one more window
set (gcf, 'Name', Image_name);
if length(Instance) > 0 % was defined
Instance = Instance+1;
Active_instances = Active_instances+1;
else
Instance = 1;
Active_instances = 1;
end
Segment_demo('Initialize', Img, 1, Instance); % needs new window
end
%-----------------------------------------
elseif strcmp(Action, 'Refresh image')
I = varargin{length(varargin)}; % last argument always
if length(Curr_pt_line) >= I
if Curr_pt_line{I} > 0
set(Curr_pt_line{I}, 'EraseMode', 'normal');
set(Curr_pt_line{I}, 'Visible', 'off');
set(Curr_pt_line{I}, 'Visible', 'on');
set(Curr_pt_line{I}, 'EraseMode', 'none');
end
end
% deleting rectangles if present - they have few points
Kids = get(Main_axis{I}, 'Children');
for i=1:length(Kids)
if strcmp(get(Kids(i), 'type'), 'line') & ...
length(get(Kids(i), 'XData')) == 5 % rectangle
set(Kids(i), 'XData', 0, 'YData', 0, 'Visible', 'off');
end
end
%-----------------------------------------
% labeling the image at a chosen place
elseif strcmp(Action, 'Label prompt')
I = varargin{length(varargin)}; % last argument always
% determining whether near an existing label
Curr_pt_local = get(gca, 'CurrentPoint');
Curr_pt_local = round(Curr_pt_local(1, 1:2));
kids = get(gca, 'children');
for i=1:length(kids)
if strcmp(get(kids(i), 'type'), 'text') & ...
strcmp(get(kids(i), 'visible'), 'on') & ...
length(get(kids(i), 'string')) > 0
text_pos = get(kids(i), 'position');
text_pos = text_pos(1:2);
if norm(Curr_pt_local-text_pos)<8
set(kids(i), 'editing', 'on');
return;
end
end
end
Prompt = {'Label', 'Font size', 'Font type', 'Font color', 'Rotated'};
Default = {'Region ', 10, 'Courier', 'black', 0};
Title = 'Labeling image';
Line_number = 1;
Label_input = My_inputdlg(Prompt, Title, Line_number, Default);
if size(Label_input, 2) > 0
new_text = text(Curr_pt_local(1), Curr_pt_local(2), Label_input{1});
set(new_text, 'fontsize', base2dec(Label_input{2}, 10), ...
'fontname', Label_input{3}, 'color', Label_input{4}, ...
'rotation', base2dec(Label_input{5}, 10));
Button = questdlg('Is it suitable?', 'Labeling', 'Yes', 'No', 'Yes');
if strcmp(Button, 'No')
set(new_text, 'visible', 'off');
end
end
%-----------------------------------------
elseif strcmp(Action, 'Show image') % for internal purposes only
I = varargin{length(varargin)}; % last argument always
Rows = size(Image{I}, 1);
Cols = size(Image{I}, 2);
if Arguments % needs size setting
Max_rc = max(Rows, Cols);
Scr_sz = get(0, 'ScreenSize');
% "tiling" the images on the screen into 3 by 4 grid
Grid_v = mod(floor((I-1)/4), 3); % finding row
Grid_h = mod(I+3, 4); % finding column
New_position(1:2) = [Scr_sz(3)*(0.04+0.24*Grid_h) ...
Scr_sz(4)*(0.08+0.31*Grid_v)];
New_position(3) = Scr_sz(3)*0.22*Cols/Max_rc;
New_position(4) = Scr_sz(4)*0.22*Rows/Max_rc;
set(Main_figure{I}, 'Position', New_position);
end
Axis_children = get(Main_axis{I}, 'Children');
Image_handle = 0;
for i=length(Axis_children):-1:1
if strcmp(get(Axis_children(i), 'Type'), 'image')
Image_handle = Axis_children(i);
break;
end
end
if Image_is_gray{I}
if not(Image_handle)
Image_handle = image(Gray_image{I});
set(Image_handle, 'Parent', Main_axis{I});
axis([1, Cols, 1, Rows]);
else
set(Image_handle, 'CData', Gray_image{I});
axis([1, Cols, 1, Rows]);
end
colormap(gray(255));
else
if not(Image_handle)
Image_handle = image(uint8(floor(double(Image{I})))); % no maps
set(Image_handle, 'Parent', Main_axis{I});
axis([1, Cols, 1, Rows]);
else
set(Image_handle, 'CData', uint8(floor(double(Image{I}))));
axis([1, Cols, 1, Rows]);
end
end
set(Main_axis{I}, 'Position', [0 0 1 1], 'XTick', [], 'YTick', []);
%----------------------------------------
elseif strcmp(Action, 'Enable region')
I = varargin{length(varargin)}; % last argument always
if Arguments == 0 % call from interactive input
close; % prompt
Arguments = Region_left{I};
Region_left{I} = 0;
end
Regions{I}{Arguments}.Private.Active = 1;
Segment_demo('Draw boundary', Arguments, I);
%-----------------------------------------
elseif strcmp(Action, 'Background region prompt')
I = varargin{length(varargin)}; % last argument always
Operation_prompt; % the common piece
if Interactive
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Background region', 0, I);
if Ok_button
set(Ok_button, 'Callback', Callback);
end
else
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Background region', 1, I);
eval(Callback);
end
%----------------------------------------
elseif strcmp(Action, 'Background region')
I = varargin{length(varargin)}; % last argument always
if Arguments == 0 % from interactive
close; % prompt
end
[Rows, Cols] = size(Regions{I}{Region_left{I}}.Public.Region_matr);
Shift = Regions{I}{Region_left{I}}.Public.Shifts(1:2, 1);
if Image_is_gray{I}
for i=1:Rows
for j=1:Cols
if Regions{I}{Region_left{I}}.Public.Region_matr(i, j)
Image{I}(i+Shift(1)-1, j+Shift(2)-1) = 0;
Gray_image{I}(i+Shift(1)-1, j+Shift(2)-1) = 0;
end
end
end
else
for i=1:Rows
for j=1:Cols
if Regions{I}{Region_left{I}}.Public.Region_matr(i, j)
Image{I}(i+Shift(1)-1, j+Shift(2)-1, :) = [0, 0, 0];
end
end
end
end
Segment_demo('Draw boundary', Region_left{I}, 'none', I);
Region_left{I} = 0;
Segment_demo('Show image', 0, I);
%-----------------------------------------
elseif strcmp(Action, 'Color prompt')
I = varargin{length(varargin)}; % last argument always
Operation_prompt; % the common piece
if Interactive
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Region color prompt', 0, I);
if Ok_button
set(Ok_button, 'Callback', Callback);
end
else
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Region color prompt', 1, I);
eval(Callback);
end
%-----------------------------------------
elseif strcmp(Action, 'Region color prompt')
I = varargin{length(varargin)}; % last argument always
if Arguments == 0 % from interactive
close; % prompt
end
Scr_sz = get(0, 'ScreenSize');
New_wind = dialog('Name', 'Choose region color', 'Position', ...
[Scr_sz(3)*0.3 Scr_sz(4)*0.4 Scr_sz(3)*0.3 Scr_sz(4)*0.1]);
set(New_wind, 'WindowStyle', 'normal');
Choice_color = uicontrol('Parent', New_wind);
set(Choice_color, 'Style', 'Popup', 'String', Region_colors, ...
'Units', 'Normalized', 'Position', [0 0.5 0.45 0.5]);
Cancel_button = uicontrol('Parent', New_wind, ...
'String', 'Cancel', 'Style', 'Pushbutton', 'Callback', 'close', ...
'Units', 'Normalized', 'Position', [0.6 0.3 0.3 0.4]);
Callback=sprintf('Segment_demo(''%s'',%18.16f,%d)', 'Region color', Choice_color, I);
Ok_button = uicontrol('Parent', New_wind, ...
'String', 'OK', 'Style', 'Pushbutton', 'Callback', Callback, ...
'Units', 'Normalized', 'Position', [0.1 0.3 0.3 0.4]);
%-----------------------------------------
elseif strcmp(Action, 'Region color')
I = varargin{length(varargin)}; % last argument always
Index_color = get(Arguments, 'Value');
Index_string = get(Arguments, 'String');
close; % input window
Regions{I}{Region_left{I}}.Private.Color = Index_string{Index_color};
Segment_demo('Draw boundary', Region_left{I}, I);
Region_left{I} = 0;
%-----------------------------------------
elseif strcmp(Action, 'Select left region')
I = varargin{length(varargin)}; % last argument always
Curr_pt_local = get(gca, 'CurrentPoint');
Curr_pt_local = round(Curr_pt_local(1, 1:2));
Curr_pt_local = Curr_pt_local(2:-1:1);
for i=Bndred_regions{I}:-1:1
Min_x = Regions{I}{i}.Public.Shifts(1, 1);
Min_y = Regions{I}{i}.Public.Shifts(2, 1);
Max_x = Regions{I}{i}.Public.Shifts(1, 2);
Max_y = Regions{I}{i}.Public.Shifts(2, 2);
if Curr_pt_local(1) >= Min_x & Curr_pt_local(1) <= Max_x
if Curr_pt_local(2) >= Min_y & Curr_pt_local(2) <= Max_y
if Regions{I}{i}.Public.Region_matr(...
Curr_pt_local(1)-Min_x+1, Curr_pt_local(2)-Min_y+1) > 0
% then the region has been found
if Region_left{I} % was assigned some value
if not(Region_left{I} == Region_right{I})
Segment_demo('Draw boundary', Region_left{I}, I);
end
end
if Region_left{I} == i % this was selected, now is deselected
Region_left{I} = 0;
else
Region_left{I} = i;
Segment_demo('Draw boundary', Region_left{I}, 'white', I);
end
break;
end
end
end
end
%-----------------------------------------
elseif strcmp(Action, 'Select right region')
I = varargin{length(varargin)}; % last argument always
Curr_pt_local = get(gca, 'CurrentPoint');
Curr_pt_local = round(Curr_pt_local(1, 1:2));
Curr_pt_local = Curr_pt_local(2:-1:1);
for i=Bndred_regions{I}:-1:1
Min_x = Regions{I}{i}.Public.Shifts(1, 1);
Min_y = Regions{I}{i}.Public.Shifts(2, 1);
Max_x = Regions{I}{i}.Public.Shifts(1, 2);
Max_y = Regions{I}{i}.Public.Shifts(2, 2);
if Curr_pt_local(1) >= Min_x & Curr_pt_local(1) <= Max_x
if Curr_pt_local(2) >= Min_y & Curr_pt_local(2) <= Max_y
if Regions{I}{i}.Public.Region_matr(...
Curr_pt_local(1)-Min_x+1, Curr_pt_local(2)-Min_y+1) > 0
% then the region has been found
if Region_right{I} % was assigned some value
if not(Region_left{I} == Region_right{I})
Segment_demo('Draw boundary', Region_right{I}, I);
end
end
if Region_right{I} == i % this was selected, now is deselected
Region_right{I} = 0;
else
Region_right{I} = i;
Segment_demo('Draw boundary', Region_right{I}, 'white', I);
end
break;
end
end
end
end
%----------------------------------------
elseif strcmp(Action, 'Disable region')
I = varargin{length(varargin)}; % last argument always
if Arguments == 0 % call from interactive input
close; % prompt
Arguments = Region_left{I};
Region_left{I} = 0;
end
Regions{I}{Arguments}.Private.Active = 0;
Segment_demo('Draw boundary', Arguments, 'none', I);
Segment_demo('Refresh image', 0, I);
%-----------------------------------------
elseif strcmp(Action, 'Find boundary')
I = varargin{length(varargin)}; % last argument always
Rows = size(Image{I}, 1);
Cols = size(Image{I}, 2);
if length(Curr_pt{I}) > 0 % was defined
if ((Curr_pt{I}(1) > 0) & (Curr_pt{I}(2) > 0) & ...
(Curr_pt{I}(1) < Rows) & (Curr_pt{I}(2) < Cols))
for i=1:size(Slices{I}, 3)
if Slices{I}(Curr_pt{I}(1), Curr_pt{I}(2), i) > 0 % in this slice
[Boundary, Area] = Extract_region_reg(Slices{I}(:, :, i) == ...
Slices{I}(Curr_pt{I}(1),Curr_pt{I}(2), i), Min_region_size{I});
break;
end
end
end
if exist('Boundary', 'var')
if size(Boundary, 2) > 1
Bndred_regions{I} = Bndred_regions{I}+1;
Regions{I}{Bndred_regions{I}}.Private.Number = Bndred_regions{I};
Regions{I}{Bndred_regions{I}}.Public.Boundary = Boundary;
Min_x = min(Boundary(1, :)); Max_x = max(Boundary(1, :));
Min_y = min(Boundary(2, :)); Max_y = max(Boundary(2, :));
Regions{I}{Bndred_regions{I}}.Public.Shifts = ...
[Min_x, Max_x; Min_y, Max_y];
Regions{I}{Bndred_regions{I}}.Public.Inner_pts = ...
[Curr_pt{I}(1); Curr_pt{I}(2)];
Regions{I}{Bndred_regions{I}}.Public.Region_matr = ...
Region_matrix(Regions{I}{Bndred_regions{I}}.Public);
Regions{I}{Bndred_regions{I}}.Private.Color = ...
Region_colors{1, 1+rem(Bndred_regions{I}-1, size(Region_colors, 2))};
% Regions{I}{Bndred_regions{I}}.Private.Color = ...
% global_color;
Regions{I}{Bndred_regions{I}}.Private.Line = 0;
Regions{I}{Bndred_regions{I}}.Private.From = [];
% setting up variables for region info values
Regions{I}{Bndred_regions{I}}.Public.Area = -99;
Regions{I}{Bndred_regions{I}}.Public.Volume= -99;
Regions{I}{Bndred_regions{I}}.Public.Avg_intensity = -99;
Menu_children = get(Region_menu{I}, 'Children');
for i=1:length(Menu_children)
set (Menu_children(i), 'Enable', 'on');
end
Segment_demo('Draw boundary first time', Bndred_regions{I}, I);
Segment_demo('Enable region', Bndred_regions{I}, I);
end
end
end
%-----------------------------------------
elseif strcmp(Action, 'Save boundary prompt')
I = varargin{length(varargin)}; % last argument always
Operation_prompt; % the common piece
if Interactive
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Save boundary', 0, I);
if Ok_button
set(Ok_button, 'Callback', Callback);
end
else
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Save boundary', 1, I);
eval(Callback);
end
%----------------------------------------
elseif strcmp(Action, 'Save boundary')
I = varargin{length(varargin)}; % last argument always
if Arguments == 0 % from interactive
close; % prompt
end
Filter = '*.rgn';
[File_name, Path_name] = uiputfile(Filter, 'Save to ...');
if File_name(1) > 0
File_name = [Path_name, File_name];
fid = fopen(File_name, 'w');
fprintf(fid, '%d %d\n', Regions{I}{Region_left{I}}.Public.Inner_pts(1:2));
fprintf(fid, '%d %d\n', 0, 0); % the separation for Inner pts
fprintf (fid, '%d %d\n', Regions{I}{Region_left{I}}.Public.Boundary);
fclose(fid);
end
Segment_demo('Draw boundary', Region_left{I}, I);
Region_left{I} = 0;
%-----------------------------------------
elseif strcmp(Action, 'Compare window regions prompt')
I = varargin{length(varargin)}; % last argument always
if not(Window_regs_chosen) % need to open one more window
Operation_prompt; % the common piece
if Interactive
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Compare window regions', 0, I);
if Ok_button
set(Ok_button, 'Callback', Callback);
end
else
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Compare window regions', 1, I);
eval(Callback);
end
else
Operation_prompt_right;
if Interactive
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Compare window regions', 0, I);
if Ok_button
set(Ok_button, 'Callback', Callback);
end
else
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Compare window regions', 1, I);
eval(Callback);
end
end
%-----------------------------------------
elseif strcmp(Action, 'Compare window regions')
I = varargin{length(varargin)}; % last argument always
if Arguments == 0 % interactive input
close;
end
if not(Window_regs_chosen) % need to open one more window
msgbox('Please choose another region', 'Another');
Window1 = I;
Window_regs_chosen = 1;
else
Window2 = I;
% computing chars if needed
if Regions{Window1}{Region_left{Window1}}.Public.Area < 0
Segment_demo('Intensity 3-d', Region_left{Window1}, Window1);
end
if Regions{Window2}{Region_right{Window2}}.Public.Area < 0
Segment_demo('Intensity 3-d', Region_right{Window2}, Window2);
end
[Bdry_dist, Reg_dist] = ...
Svd_dist_reg(Regions{Window1}{Region_left{Window1}}.Public, ...
Regions{Window2}{Region_right{Window2}}.Public);
Msg = [sprintf('Boundary difference: %6.2f\n\n', Bdry_dist), ...
sprintf('Region difference: %6.2f\n\n', Reg_dist), ...
sprintf('Areas ratio: %6.2f\n\n', ...
Regions{Window1}{Region_left{Window1}}.Public.Area/...
Regions{Window2}{Region_right{Window2}}.Public.Area), ...
sprintf('Volumes ratio: %6.2f\n\n', ...
Regions{Window1}{Region_left{Window1}}.Public.Volume/...
Regions{Window2}{Region_right{Window2}}.Public.Volume), ...
sprintf('Avg intensities ratio: %6.2f', ...
Regions{Window1}{Region_left{Window1}}.Public.Avg_intensity/...
Regions{Window2}{Region_right{Window2}}.Public.Avg_intensity)
];
Wind_name = sprintf('%d and %d regions differences and ratios', ...
Region_left{Window1}, Region_right{Window2});
msgbox(Msg, Wind_name);
Segment_demo('Draw boundary', Region_left{Window1}, Window1);
Segment_demo('Draw boundary', Region_right{Window2}, Window2);
Region_left{Window1} = 0; Region_right{Window2} = 0;
Window_regs_chosen = 0;
end
%-----------------------------------------
elseif strcmp(Action, 'Compare image regions prompt')
I = varargin{length(varargin)}; % last argument always
Operation_prompt; % the common piece
Right_button; % one more button here if Interactive
if Interactive
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Compare image regions', 0, I);
if Ok_button
set(Ok_button, 'Callback', Callback);
end
else
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Compare image regions', 1, I);
eval(Callback);
end
%-----------------------------------------
elseif strcmp(Action, 'Compare image regions')
I = varargin{length(varargin)}; % last argument always
if Arguments == 0 % interactive call
close; % prompt
end
if Region_right{I} == 0
return;
end
[Bdry_dist, Reg_dist] = ...
Svd_dist_reg(Regions{I}{Region_left{I}}.Public, ...
Regions{I}{Region_right{I}}.Public);
% computing chars if needed
if Regions{I}{Region_left{I}}.Public.Area < 0
Segment_demo('Intensity 3-d', Region_left{I}, I);
end
if Regions{I}{Region_right{I}}.Public.Area < 0
Segment_demo('Intensity 3-d', Region_right{I}, I);
end
[Bdry_dist, Reg_dist] = ...
Svd_dist_reg(Regions{I}{Region_left{I}}.Public, ...
Regions{I}{Region_right{I}}.Public);
Msg = [sprintf('Boundary difference: %6.2f\n\n', Bdry_dist), ...
sprintf('Region difference: %6.2f\n\n', Reg_dist), ...
sprintf('Areas ratio: %6.2f\n\n', ...
Regions{I}{Region_left{I}}.Public.Area/...
Regions{I}{Region_right{I}}.Public.Area), ...
sprintf('Volumes ratio: %6.2f\n\n', ...
Regions{I}{Region_left{I}}.Public.Volume/...
Regions{I}{Region_right{I}}.Public.Volume), ...
sprintf('Avg intensities ratio: %6.2f', ...
Regions{I}{Region_left{I}}.Public.Avg_intensity/...
Regions{I}{Region_right{I}}.Public.Avg_intensity)
];
Wind_name = sprintf('%d and %d regions differences and ratios', ...
Region_left{I}, Region_right{I});
msgbox(Msg, Wind_name);
Segment_demo('Draw boundary', Region_left{I}, I);
Segment_demo('Draw boundary', Region_right{I}, I);
Region_left{I} = 0; Region_right{I} = 0;
%-----------------------------------------
elseif strcmp(Action, 'Compare disk regions prompt')
I = varargin{length(varargin)}; % last argument always
Operation_prompt; % the common piece
if Interactive
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Compare disk regions', 0, I);
if Ok_button
set(Ok_button, 'Callback', Callback);
end
else
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Compare disk regions', 1, I);
eval(Callback);
end
%-----------------------------------------
elseif strcmp(Action, 'Compare disk regions')
I = varargin{length(varargin)}; % last argument always
if Arguments == 0 % interactive input
close; % prompt
end
Filter = '*.rgn';
[File_name, Path_name] = uigetfile(Filter, 'Compare to ...');
if File_name(1) > 0
File_name = [Path_name, File_name];
fid = fopen(File_name, 'r');
k = 0;
Pt_scanned(1:2, 1) = fscanf(fid, '%d', [2, 1]);
while sum(Pt_scanned) > 0
k = k+1;
Region2.Public.Inner_pts(:, k) = Pt_scanned;
Pt_scanned(1:2, 1) = fscanf(fid, '%d', [2, 1]);
end
Region2.Public.Boundary = fscanf(fid, '%d', [2, inf]);
Min_x = min(Region2.Public.Boundary(1, :));
Max_x = max(Region2.Public.Boundary(1, :));
Min_y = min(Region2.Public.Boundary(2, :));
Max_y = max(Region2.Public.Boundary(2, :));
Region2.Public.Shifts = [Min_x, Max_x; Min_y, Max_y];
fclose(fid);
[Bdry_dist, Reg_dist] = ...
Svd_dist_reg(Regions{I}{Region_left{I}}.Public, Region2.Public);
Msg = [sprintf('Boundary difference is %6.2f\n\n', Bdry_dist), ...
sprintf('Region difference is %6.2f', Reg_dist)];
msgbox(Msg, 'Difference');
end
Segment_demo('Draw boundary', Region_left{I}, I);
Region_left{I} = 0;
%-----------------------------------------
elseif strcmp(Action, 'Intensity 3-d prompt')
I = varargin{length(varargin)}; % last argument always
Operation_prompt; % the common piece
if Interactive
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Intensity 3-d', 0, I);
if Ok_button
set(Ok_button, 'Callback', Callback);
end
else
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Intensity 3-d', -1, I);
eval(Callback);
end
%-----------------------------------------
elseif strcmp(Action, 'Intensity 3-d')
I = varargin{length(varargin)}; % last argument always
if Arguments == 0 % interactive call
Region_number = Region_left{I};
close; % prompt
elseif Arguments == -1 % was selected not by menu
Region_number = Region_left{I};
else
Region_number = Arguments;
end
Volume = 0;
Area = 0;
[Rows, Cols] = size(Regions{I}{Region_number}.Public.Region_matr);
To_display = zeros(Cols, Rows);
Shift = Regions{I}{Region_number}.Public.Shifts(1:2, 1);
for i=1:Rows
for j=1:Cols
if Regions{I}{Region_number}.Public.Region_matr(i, j)
To_display(j, i) = Gray_image{I}(i+Shift(1)-1, j+Shift(2)-1);
Volume = Volume+To_display(j, i);
Area = Area+1;
end
end
end
Min = min(To_display(find(To_display > 0)));
To_display = max(To_display, ones(size(To_display))*Min);
figure; % (2)
mesh(To_display);
set(gca, 'XTick', [], 'YTick', [], 'view', [77, 67]); % a better viewpoint
zlabel('Intensity');
Wind_name = sprintf('Region %d Intensity 3-d', Region_number);
set(gcf, 'MenuBar', 'none', 'Name', Wind_name);
Rotate_menu = uimenu('Label','&Rotate');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Rotate left', 0, I);
uimenu (Rotate_menu, 'Label', 'Left', ...
'Callback', Callback, 'Accelerator', 'L');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Rotate right', 0, I);
uimenu (Rotate_menu, 'Label', 'Right', ...
'Callback', Callback, 'Accelerator', 'R');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Rotate up', 0, I);
uimenu (Rotate_menu, 'Label', 'Up', ...
'Callback', Callback, 'Accelerator', 'U');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Rotate down', 0, I);
uimenu (Rotate_menu, 'Label', 'Down', ...
'Callback', Callback, 'Accelerator', 'D');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Increase rotation', 0, I);
uimenu (Rotate_menu, 'Label', 'Increase', ...
'Callback', Callback, 'Accelerator', 'A');
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Decrease rotation', 0, I);
uimenu (Rotate_menu, 'Label', 'Decrease', ...
'Callback', Callback, 'Accelerator', 'V');
Max = max(max(To_display));
Regions{I}{Region_number}.Public.Area = Area; % storing area
Area_string = sprintf('Region area\t%10.2f', Area);
Regions{I}{Region_number}.Public.Volume = Volume; % storing volume
Volume_string = sprintf('Volume\t%10.2f', Volume); % compute avg intens
Avg_intensity = Volume/Area;
Regions{I}{Region_number}.Public.Avg_intensity = Avg_intensity;
Avg_intensity_string = sprintf('Average intensity\t%10.2f', Avg_intensity);
Intensity_normed_volume_string = ...
sprintf('Intensity normalized volume\t%10.2f', Volume/Max);
Values_menu = uimenu('Label', '&Values');
uimenu (Values_menu, 'Label', Area_string);
uimenu (Values_menu, 'Label', Volume_string);
uimenu (Values_menu, 'Label', Avg_intensity_string);
uimenu (Values_menu, 'Label', Intensity_normed_volume_string);
if Arguments <= 0 % interactive
Segment_demo('Draw boundary', Region_left{I}, I);
Region_left{I} = 0;
end
%-----------------------------------------
elseif strcmp(Action, 'Rotate right')
I = varargin{length(varargin)}; % last argument always
Az_el = get(gca, 'View');
set(gca, 'View', [Az_el(1)-Amnt_rot{I}, Az_el(2)]);
%-----------------------------------------
elseif strcmp(Action, 'Rotate left')
I = varargin{length(varargin)}; % last argument always
Az_el = get(gca, 'View');
set(gca, 'View', [Az_el(1)+Amnt_rot{I}, Az_el(2)]);
%-----------------------------------------
elseif strcmp(Action, 'Rotate up')
I = varargin{length(varargin)}; % last argument always
Az_el = get(gca, 'View');
set(gca, 'View', [Az_el(1), Az_el(2)-Amnt_rot{I}]);
%-----------------------------------------
elseif strcmp(Action, 'Rotate down')
I = varargin{length(varargin)}; % last argument always
Az_el = get(gca, 'View');
set(gca, 'View', [Az_el(1), Az_el(2)+Amnt_rot{I}]);
%-----------------------------------------
elseif strcmp(Action, 'Increase rotation')
I = varargin{length(varargin)}; % last argument always
Amnt_rot{I} = Amnt_rot{I}*2;
%-----------------------------------------
elseif strcmp(Action, 'Decrease rotation')
I = varargin{length(varargin)}; % last argument always
Amnt_rot{I} = Amnt_rot{I}/2;
%-----------------------------------------
elseif strcmp(Action, 'Cut prompt')
I = varargin{length(varargin)}; % last argument always
Operation_prompt; % the common piece
if Interactive
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Region cut prompt', 0, I);
if Ok_button
set(Ok_button, 'Callback', Callback);
end
else
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Region cut prompt', 1, I);
eval(Callback);
end
%-----------------------------------------
elseif strcmp(Action, 'Region cut prompt')
I = varargin{length(varargin)}; % last argument always
if Arguments == 0 % interactive input
close;
end
Scr_sz = get(0, 'ScreenSize');
New_wind = dialog('Name', 'Draw cutting line', 'Position', ...
[Scr_sz(3)*0.3 Scr_sz(4)*0.4 Scr_sz(3)*0.3 Scr_sz(4)*0.1]);
set(New_wind, 'WindowStyle', 'normal');
Cancel_button = uicontrol('Parent', New_wind, ...
'String', 'Cancel', 'Style', 'Pushbutton', 'Callback', 'close', ...
'Units', 'Normalized', 'Position', [0.6 0.3 0.3 0.4]);
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Cut', 0, I);
Ok_button = uicontrol('Parent', New_wind, ...
'String', 'OK', 'Style', 'Pushbutton', 'Callback', Callback, ...
'Units', 'Normalized', 'Position', [0.1 0.3 0.3 0.4]);
Store_mouse_pts{I} = 1;
Curr_pt{I}= zeros(2, 0);
%-----------------------------------------
elseif strcmp(Action, 'Cut')
I = varargin{length(varargin)}; % last argument always
close; % the dialogue window
Dense_pts = Fit_spline(Curr_pt{I});
[Bdry{1}, Inner{1}, Bdry{2}, Inner{2}] = ...
Cut_boundary_reg(Regions{I}{Region_left{I}}.Public, Dense_pts);
if (size(Bdry{1}, 2) > 1) & (size(Bdry{2}, 2) > 1) % detected boundaries
for i=1:2
Bndred_regions{I} = Bndred_regions{I}+1;
Regions{I}{Bndred_regions{I}}.Public.Boundary = Bdry{i};
Regions{I}{Bndred_regions{I}}.Public.Inner_pts = Inner{i};
Min_x = min(Regions{I}{Bndred_regions{I}}.Public.Boundary(1, :));
Max_x = max(Regions{I}{Bndred_regions{I}}.Public.Boundary(1, :));
Min_y = min(Regions{I}{Bndred_regions{I}}.Public.Boundary(2, :));
Max_y = max(Regions{I}{Bndred_regions{I}}.Public.Boundary(2, :));
Regions{I}{Bndred_regions{I}}.Public.Shifts = ...
[Min_x, Max_x; Min_y, Max_y];
Regions{I}{Bndred_regions{I}}.Private.Number = Bndred_regions{I};
Regions{I}{Bndred_regions{I}}.Public.Region_matr = ...
Region_matrix(Regions{I}{Bndred_regions{I}}.Public);
Regions{I}{Bndred_regions{I}}.Private.Color = ...
Region_colors{1, 1+rem(Bndred_regions{I}-1,size(Region_colors, 2))};
Regions{I}{Bndred_regions{I}}.Private.From = [Region_left{I}];
Regions{I}{Bndred_regions{I}}.Public.Area = -99;
Regions{I}{Bndred_regions{I}}.Public.Volume= -99;
Regions{I}{Bndred_regions{I}}.Public.Avg_intensity = -99;
Segment_demo('Draw boundary first time', Bndred_regions{I}, I);% Line
Segment_demo('Enable region', Bndred_regions{I}, I);
end
Segment_demo('Disable region', Region_left{I}, I);
end
Region_left{I} = 0;
Store_mouse_pts{I} = 0;
set(Curr_pt_line{I}, 'EraseMode', 'normal');
set(Curr_pt_line{I}, 'Visible', 'off');
Curr_pt_line{I} = 0;
Segment_demo('Down', 0, I);
Segment_demo('Refresh', 0, I);
% ----------------------------------------- "left" region
elseif strcmp(Action, 'Left')
I = varargin{length(varargin)}; % last argument always
Index_left = get(Arguments, 'Value');
Labels = get(Arguments, 'String');
Temp_region_left = base2dec(Labels{Index_left}, 10);
% restoring the old region first
if Region_left{I} % was assigned some value
if not(Region_left{I} == Region_right{I})
Segment_demo('Draw boundary', Region_left{I}, I);
end
end
Region_left{I} = Temp_region_left;
Segment_demo('Draw boundary', Region_left{I}, 'white', I);
%-----------------------------------------
% "right" region
elseif strcmp(Action, 'Right')
I = varargin{length(varargin)}; % last argument always
Index_right = get(Arguments, 'Value');
Labels = get(Arguments, 'String');
Temp_region_right = base2dec(Labels{Index_right}, 10);
% restoring the old region first
if Region_right{I} % was defined
if not(Region_left{I} == Region_right{I})
Segment_demo('Draw boundary', Region_right{I}, I);
end
end
Region_right{I} = Temp_region_right;
Segment_demo('Draw boundary', Region_right{I}, 'white', I);
%-----------------------------------------
elseif strcmp(Action, 'Cancel operation') % don't perform operation
I = varargin{length(varargin)}; % last argument always
close;
if Region_left{I}
Segment_demo('Draw boundary', Region_left{I}, I);
Region_left{I} = 0;
end
if Region_right{I}
Segment_demo('Draw boundary', Region_right{I}, I);
Region_right{I} = 0;
end
Store_mouse_pts{I} = 0;
%-----------------------------------------
elseif strcmp(Action, 'Merge prompt')
I = varargin{length(varargin)}; % last argument always
Operation_prompt; % the common piece
Right_button; % one more button here
if Interactive
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Merge', 0, I);
if Ok_button
set(Ok_button, 'Callback', Callback);
end
else
Callback=sprintf('Segment_demo(''%s'',%d,%d)', 'Merge', 1, I);
eval(Callback);
end
%-----------------------------------------
elseif strcmp(Action, 'Merge') % the two regions have been defined
I = varargin{length(varargin)}; % last argument always
if Arguments == 0 % interactive call
close; % prompt
end
Bndred_regions{I} = Bndred_regions{I}+1;
[Regions{I}{Bndred_regions{I}}.Public.Inner_pts, ...
Regions{I}{Bndred_regions{I}}.Public.Boundary, ...
Regions{I}{Bndred_regions{I}}.Public.Shifts] = Merge_regions(...
Regions{I}{Region_left{I}}.Public, Regions{I}{Region_right{I}}.Public);
Regions{I}{Bndred_regions{I}}.Public.Region_matr = ...
Region_matrix(Regions{I}{Bndred_regions{I}}.Public);
Regions{I}{Bndred_regions{I}}.Private.Color = ...
Region_colors{1, 1+rem(Bndred_regions{I}-1, size(Region_colors, 2))};
Regions{I}{Bndred_regions{I}}.Private.Number = Bndred_regions{I};
Regions{I}{Bndred_regions{I}}.Private.From=[Region_left{I}, Region_right{I}];
Regions{I}{Bndred_regions{I}}.Public.Area = -99;
Regions{I}{Bndred_regions{I}}.Public.Volume = -99;
Regions{I}{Bndred_regions{I}}.Public.Avg_intensity = -99;
Segment_demo('Draw boundary first time', Bndred_regions{I}, I);
Segment_demo('Enable region', Bndred_regions{I}, I);
Segment_demo('Disable region', Region_left{I}, I);
Segment_demo('Disable region', Region_right{I}, I);
Region_left{I} = 0; Region_right{I} = 0;
% --------------------
elseif strcmp(Action, 'Draw boundary first time')
I = varargin{length(varargin)}; % last argument always
Regions{I}{Arguments}.Private.Line = ...
line('XData', Regions{I}{Arguments}.Public.Boundary(2, :), ...
'YData', Regions{I}{Arguments}.Public.Boundary(1, :), ...
'Parent', Main_axis{I}, 'Color', Regions{I}{Arguments}.Private.Color, ...
'Marker', '.', 'LineStyle', '.', 'EraseMode', 'none', ...
'Visible', 'off', 'LineWidth', Marker_size, 'MarkerSize', Marker_size);
% -------------------- since repeates so often
elseif strcmp(Action, 'Draw boundary')
I = varargin{length(varargin)}; % last argument always
if length(varargin) == 1 % draw the region in the usual color
if Regions{I}{Arguments}.Private.Active
set(Regions{I}{Arguments}.Private.Line, 'Visible', 'off');
set(Regions{I}{Arguments}.Private.Line, ...
'Color', Regions{I}{Arguments}.Private.Color, 'Visible', 'on');
else
set(Regions{I}{Arguments}.Private.Line, 'Visible', 'off');
end
else
if strcmp(varargin{1}, 'white') % draw in white
set(Regions{I}{Arguments}.Private.Line, ...
'Color', 'white', 'Visible', 'on');
elseif strcmp(varargin{1}, 'none') % don't draw
set(Regions{I}{Arguments}.Private.Line, 'Visible', 'off');
end
end
end
% let's represent regions (whose boundaries we were asked to find) by
% those boundaries and make the merging part as filling those
% boundaries and taking union as it was done before. In this fashion
% we can handle new regions, not to abuse the original image. Merging
% will be done on pairs of regions resulting in a new region