⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 segmentimage.m

📁 this is image segmentation code
💻 M
字号:
function SegmentImage(imgfile1,choice)if nargin==2	switch choice	case 'b1'	   ud = get(gcf,'UserData');	   ud = update_view(ud);	   [ud.pt1(2) ud.pt1(1) ud.pt2(2) ud.pt2(1)]	   if ud.flag == 0	     ud.flag = 1;	   elseif ud.flag == 1	     ud.flag = 0;	   end	   set(gcf,'UserData',ud);	case 'object'	    ud = get(gcf,'UserData');	    [m,n] = size(ud.Object);	    ud.Object(m+1,:) = [ud.pt1(2) ud.pt1(1) ud.pt2(2) ud.pt2(1)];	    for i=ud.pt1(2):ud.pt2(2)		ud.showimg(i,ud.pt1(1),:) = [255 0 0];		ud.showimg(i,ud.pt2(1),:) = [255 0 0];	    end	    for i=ud.pt1(1):ud.pt2(1)		ud.showimg(ud.pt1(2),i,:) = [255 0 0];		ud.showimg(ud.pt2(2),i,:) = [255 0 0];	    end	    set(ud.h(1),'CData',ud.showimg);	    set(gcf,'UserData',ud);	    disp('object');	    disp(ud.Object);	case 'background'	    ud = get(gcf,'UserData');	    [m,n] = size(ud.Background);	    ud.Background(m+1,:) = [ud.pt1(2) ud.pt1(1) ud.pt2(2) ud.pt2(1)];	    for i=ud.pt1(2):ud.pt2(2)		ud.showimg(i,ud.pt1(1),:) = [0 0 255];		ud.showimg(i,ud.pt2(1),:) = [0 0 255];	    end	    for i=ud.pt1(1):ud.pt2(1)		ud.showimg(ud.pt1(2),i,:) = [0 0 255];		ud.showimg(ud.pt2(2),i,:) = [0 0 255];	    end	    set(ud.h(1),'CData',ud.showimg);	    set(gcf,'UserData',ud);	    disp('background');	    disp(ud.Background);	case 'bbox'	    ud = get(gcf,'UserData');	    ud = BBox(ud);	    set(gcf,'UserData',ud);	case 'segment'	    ud = get(gcf,'UserData');	    ud = MaxFlow(ud);	    disp('segment');	    set(gcf,'UserData',ud);	case 'reset'	    ud = get(gcf,'UserData');	    ud.showimg = ud.img1;	    ud.img2 = ud.img1;	    set(ud.h(1),'CData',ud.showimg);	    set(ud.h(2),'CData',ud.img2);	    ud.Object = [ 0 0 -1 -1];	    ud.Background = [ 0 0 -1 -1];	    set(gcf,'UserData',ud);	case 'remove'	    ud = get(gcf,'UserData');	    ud = Remove(ud);	    set(gcf,'UserData',ud);	   otherwise	end	elseif nargin == 1 % initialize   h0 = figure('Color',[0.8 0.8 0.8], ...	       'NumberTitle','off', ...	       'Name','Play With Convolutions', ...	       'ButtonDownFcn', 'disp(''Click on images'')',...	       'WindowButtonUpFcn', 'SegmentImage(''img1'',''none'');',...	       'WindowButtonMotionFcn', 'SegmentImage(''img1'',''move'')', ...	       'Pointer', 'crosshair', ...	       'DoubleBuffer', 'on',...	       'Units','normalized');   s=get(h0, 'Position');   set(h0, 'Position', [.02 s(2) .96 s(4)]);   clear s   img1 = imread(imgfile1);   img2=img1;   showimg = img1;   ah1 = axes('Parent', h0, ...	      'Position',[0.1 0 .44 1]);   h1=imagesc(showimg); hold on; title('Image 1');   axis image   set(h1, 'ButtonDownFcn','SegmentImage(''img1'',''b1'');');   ah2 = axes('Parent',h0, ...	      'Position',[.56 0 .44 1]);   h2=imagesc(img2); hold on; title('Image 2');   axis image   set(h2, 'ButtonDownFcn','SegmentImage(''img1'',''b2'');');   % Add some gadgets:    bh = uicontrol('Parent', h0, 'Units','normalized', ...		  'Style', 'pushbutton', 'String', 'B. Box',...		  'Position', [0 .7 .1 .1], ...		  'Callback', 'SegmentImage(''img1'',''bbox'')');    bh = uicontrol('Parent', h0, 'Units','normalized', ...		  'Style', 'pushbutton', 'String', 'Object',...		  'Position', [0 .6 .1 .1], ...		  'Callback', 'SegmentImage(''img1'',''object'')');    bh = uicontrol('Parent', h0, 'Units','normalized', ...		  'Style', 'pushbutton', 'String', 'Background',...		  'Position', [0 .5 .1 .1], ...		  'Callback', 'SegmentImage(''img1'',''background'')');    bh = uicontrol('Parent', h0, 'Units','normalized', ...		  'Style', 'pushbutton', 'String', 'Segment',...		  'Position', [0 .4 .1 .1], ...		  'Callback', 'SegmentImage(''img1'',''segment'')');    bh = uicontrol('Parent', h0, 'Units','normalized', ...		  'Style', 'pushbutton', 'String', 'Reset',...		  'Position', [0 .3 .1 .1], ...		  'Callback', 'SegmentImage(''img1'',''reset'')');    bh = uicontrol('Parent', h0, 'Units','normalized', ...		  'Style', 'pushbutton', 'String', 'Remove',...		  'Position', [0 .2 .1 .1], ...		  'Callback', 'SegmentImage(''img1'',''remove'')');   hr1=plot([-101 -100 -100 -101 -101], [-101 -101 -100 -100 -101], ...	    'r-', 'LineWidth', 1, 'EraseMode', 'xor', 'Parent', ah1);   hr2=plot([-101 -100 -100 -101 -101], [-101 -101 -100 -100 -101], ...	    'b-', 'LineWidth', 1, 'EraseMode', 'xor', 'Parent', ah1);   flag = 0;   Object = [ 0 0 -1 -1];   Background = [0 0 -1 -1];   pt1 = [ -1 -1];   pt2 = [ -1 -1];   colormap default   s1 = size(img1); s2 = size(img2);   ud=struct('h0', h0, 'h',[h1 h2], 'ah', [ah1, ah2], ...	     'current', -1, 'color', 'k', 'size', 1, ...	     'sizes',[s1(1:2); s2(1:2)], ...	     'rects', [hr1 hr2], ...	     'Object', Object, ...	     'Background', Background, ...	     'pt1', pt1, 'pt2', pt2, ...	     'showimg', showimg, ...	     'img1',img1,'img2',img2,'flag', flag);   set(h0,'UserData',ud);endfunction ud = update_view(ud)%s=ceil(size(ud.kernel)/2)+.5;%s=ceil(ud.winsize/2);s = [2 2];[x y]=getcurpt(ud.ah(1));x=round(x); y=round(y);mx=max(1, x-s(2)); Mx=min(ud.sizes(1,2), x+s(2));my=max(1, y-s(1)); My=min(ud.sizes(1,1), y+s(1));if ud.flag == 0set(ud.rects(1), 'XData', [mx-.5 Mx+.5 Mx+.5 mx-.5 mx-.5], ...		 'YData', [my-.5 my-.5 My+.5 My+.5 my-.5]);ud.pt1 = [x y];elseset(ud.rects(2), 'XData', [mx-.5 Mx+.5 Mx+.5 mx-.5 mx-.5], ...		 'YData', [my-.5 my-.5 My+.5 My+.5 my-.5]);ud.pt2 = [x y];end% To update the view:%cdata=get(ud.h(2), 'CData');% To change only current region:cdata=ud.img2;%cdata(my:My, mx:Mx) = ud.i2conv(my:My, mx:Mx);%set(ud.h(2), 'CData', cdata);%%%%%% getcurpt%%%function [x,y] = getcurpt(axHandle)% Shamelessly taken from /usr/local/matlab6/toolbox/images/images/private/%GETCURPT Get current point.%   [X,Y] = GETCURPT(AXHANDLE) gets the x- and y-coordinates of%   the current point of AXHANDLE.  GETCURPT compensates these%   coordinates for the fact that get(gca,'CurrentPoint') returns%   the data-space coordinates of the idealized left edge of the%   screen pixel that the user clicked on.  For IPT functions, we%   want the coordinates of the idealized center of the screen%   pixel that the user clicked on.%   Copyright 1993-2000 The MathWorks, Inc.%   $Revision: 1.4 $  $Date: 2002/01/14 12:43:34 $pt = get(axHandle, 'CurrentPoint');x = pt(1,1);y = pt(1,2);% What is the extent of the idealized screen pixel in axes% data space?axUnits = get(axHandle, 'Units');set(axHandle, 'Units', 'pixels');axPos = get(axHandle, 'Position');set(axHandle, 'Units', axUnits);axPixelWidth = axPos(3);axPixelHeight = axPos(4);axXLim = get(axHandle, 'XLim');axYLim = get(axHandle, 'YLim');xExtentPerPixel = abs(diff(axXLim)) / axPixelWidth;yExtentPerPixel = abs(diff(axYLim)) / axPixelHeight;x = x + xExtentPerPixel/2;y = y + yExtentPerPixel/2;function ud = MaxFlow(ud)	fid = fopen('obj.txt','w');	[m,n] = size(ud.Object);	for i=2:m		fprintf(fid,'%d %d %d %d\n',ud.Object(i,1),ud.Object(i,2),ud.Object(i,3),ud.Object(i,4));	end	fclose(fid);	fid = fopen('bkg.txt','w');	[m,n] = size(ud.Background);	for i=2:m		fprintf(fid,'%d %d %d %d\n',ud.Background(i,1),ud.Background(i,2),ud.Background(i,3),ud.Background(i,4));	end	fclose(fid);	imwrite(ud.img1,'in.ppm');	s = sprintf('./segment in.ppm obj.txt bkg.txt');	system(s);	map = imread('out.ppm');	[h,w,d] = size(map);	for i=1:h		for j=1:w			if map(i,j,3) == 255				ud.img2(i,j,:) = [255 0 0];			else				ud.img2(i,j,:) = ud.img1(i,j,:);			end		end	end	set(ud.h(2),'CData',ud.img2);function	ud = BBox(ud)	[m,n] = size(ud.Background);	[h,w,d] = size(ud.img1);	ud.Background(m+1,:) = [1 1 h ud.pt1(1)];	ud.Background(m+2,:) = [1 1 ud.pt1(2) w];	ud.Background(m+3,:) = [1 ud.pt2(1) h w];	ud.Background(m+4,:) = [ud.pt2(2) 1 h w];	for i = m+1:m+4		vec = ud.Background(i,:);		for j=vec(1):vec(3)			ud.showimg(j,vec(2),:) = [0 0 255];			ud.showimg(j,vec(4),:) = [0 0 255];		end		for j=vec(2):vec(4)			ud.showimg(vec(1),j,:) = [0 0 255];			ud.showimg(vec(3),j,:) = [0 0 255];		end	end	set(ud.h(1),'CData',ud.showimg);function	ud = Remove(ud)	[m,n] = size(ud.Object);	for i=1:m		if ud.pt1(2) > ud.Object(i,1) & ud.pt1(2) < ud.Object(i,3) & ud.pt1(1) > ud.Object(i,2) & ud.pt1(1) < ud.Object(i,4)		if ud.pt2(2) > ud.Object(i,1) & ud.pt2(2) < ud.Object(i,3) & ud.pt2(1) > ud.Object(i,2) & ud.pt2(1) < ud.Object(i,4)			ud.Object(i,:) = [ 0 0 -1 -1];		end		end	end	[m,n] = size(ud.Background);	for i=1:m		if ud.pt1(2) > ud.Background(i,1) & ud.pt1(2) < ud.Background(i,3) & ud.pt1(1) > ud.Background(i,2) & ud.pt1(1) < ud.Background(i,4)		if ud.pt2(2) > ud.Background(i,1) & ud.pt2(2) < ud.Background(i,3) & ud.pt2(1) > ud.Background(i,2) & ud.pt2(1) < ud.Background(i,4)			ud.Background(i,:) = [ 0 0 -1 -1];		end		end	end	ud.showimg = ud.img1;	[m,n] = size(ud.Object);	for i = 2:m		vec = ud.Object(i,:);		for j=vec(1):vec(3)			ud.showimg(j,vec(2),:) = [255 0 0];			ud.showimg(j,vec(4),:) = [255 0 0];		end		for j=vec(2):vec(4)			ud.showimg(vec(1),j,:) = [255 0 0];			ud.showimg(vec(3),j,:) = [255 0 0];		end	end	[m,n] = size(ud.Background);	for i = 2:m		vec = ud.Background(i,:);		for j=vec(1):vec(3)			ud.showimg(j,vec(2),:) = [0 0 255];			ud.showimg(j,vec(4),:) = [0 0 255];		end		for j=vec(2):vec(4)			ud.showimg(vec(1),j,:) = [0 0 255];			ud.showimg(vec(3),j,:) = [0 0 255];		end	end	set(ud.h(1),'CData',ud.showimg);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -