?? segmentimage.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 + -