134 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Matlab
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Matlab
		
	
	
	
	
	
#! /usr/bin/env octave
 | 
						|
 | 
						|
cv;
 | 
						|
highgui;
 | 
						|
 | 
						|
global g;
 | 
						|
g.marker_mask = [];
 | 
						|
g.markers = [];
 | 
						|
g.img0 = []
 | 
						|
g.img = []
 | 
						|
g.img_gray = [] 
 | 
						|
g.wshed = []
 | 
						|
g.prev_pt = cvPoint(-1,-1);
 | 
						|
 | 
						|
function on_mouse( event, x, y, flags, param )
 | 
						|
  global g;
 | 
						|
  global cv;
 | 
						|
  global highgui;
 | 
						|
 | 
						|
  if( !swig_this( g.img) )
 | 
						|
    return;
 | 
						|
  endif
 | 
						|
  if( event == highgui.CV_EVENT_LBUTTONUP || ! bitand(flags,highgui.CV_EVENT_FLAG_LBUTTON) )
 | 
						|
    g.prev_pt = cvPoint(-1,-1);
 | 
						|
  elseif( event == highgui.CV_EVENT_LBUTTONDOWN )
 | 
						|
    g.prev_pt = cvPoint(x,y);
 | 
						|
  elseif( event == highgui.CV_EVENT_MOUSEMOVE && bitand(flags,highgui.CV_EVENT_FLAG_LBUTTON) )
 | 
						|
    pt = cvPoint(x,y);
 | 
						|
    if( g.prev_pt.x < 0 )
 | 
						|
      g.prev_pt = pt;
 | 
						|
    endif
 | 
						|
    cvLine( g.marker_mask, g.prev_pt, pt, cvScalarAll(255), 5, 8, 0 );
 | 
						|
    cvLine( g.img, g.prev_pt, pt, cvScalarAll(255), 5, 8, 0 );
 | 
						|
    g.prev_pt = pt;
 | 
						|
    cvShowImage( "image", g.img );
 | 
						|
  endif
 | 
						|
endfunction
 | 
						|
 | 
						|
filename = "../c/fruits.jpg";
 | 
						|
if (size(argv, 1)>=1)
 | 
						|
  filename = argv(){1};
 | 
						|
endif
 | 
						|
 | 
						|
rng = cvRNG(-1);
 | 
						|
g.img0 = cvLoadImage(filename,1);
 | 
						|
if (!swig_this(g.img0))
 | 
						|
  print "Error opening image '%s'" % filename
 | 
						|
  exit(-1)
 | 
						|
endif
 | 
						|
 | 
						|
printf("Hot keys:\n");
 | 
						|
printf("\tESC - quit the program\n");
 | 
						|
printf("\tr - restore the original image\n");
 | 
						|
printf("\tw - run watershed algorithm\n");
 | 
						|
printf("\t  (before that, roughly outline several g.markers on the image)\n");
 | 
						|
 | 
						|
cvNamedWindow( "image", 1 );
 | 
						|
cvNamedWindow( "watershed transform", 1 );
 | 
						|
 | 
						|
g.img = cvCloneImage( g.img0 );
 | 
						|
g.img_gray = cvCloneImage( g.img0 );
 | 
						|
g.wshed = cvCloneImage( g.img0 );
 | 
						|
g.marker_mask = cvCreateImage( cvGetSize(g.img), 8, 1 );
 | 
						|
g.markers = cvCreateImage( cvGetSize(g.img), IPL_DEPTH_32S, 1 );
 | 
						|
 | 
						|
cvCvtColor( g.img, g.marker_mask, CV_BGR2GRAY );
 | 
						|
cvCvtColor( g.marker_mask, g.img_gray, CV_GRAY2BGR );
 | 
						|
 | 
						|
cvZero( g.marker_mask );
 | 
						|
cvZero( g.wshed );
 | 
						|
 | 
						|
cvShowImage( "image", g.img );
 | 
						|
cvShowImage( "watershed transform", g.wshed );
 | 
						|
 | 
						|
cvSetMouseCallback( "image", @on_mouse, [] );
 | 
						|
while (true)
 | 
						|
  c = cvWaitKey(0);
 | 
						|
  if (c=='\x1b')
 | 
						|
    break;
 | 
						|
  endif
 | 
						|
  if (c == 'r')
 | 
						|
    cvZero( g.marker_mask );
 | 
						|
    cvCopy( g.img0, g.img );
 | 
						|
    cvShowImage( "image", g.img );
 | 
						|
  endif
 | 
						|
  if (c == 'w')
 | 
						|
    storage = cvCreateMemStorage(0);
 | 
						|
    comp_count = 0;
 | 
						|
    ##cvSaveImage( "g.wshed_mask.png", g.marker_mask );
 | 
						|
    ##g.marker_mask = cvLoadImage( "g.wshed_mask.png", 0 );
 | 
						|
    [nb_cont, contours] = cvFindContours( g.marker_mask, storage, \
 | 
						|
				       sizeof_CvContour, \
 | 
						|
				       CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
 | 
						|
    cvZero( g.markers );
 | 
						|
    swig_this(contours)
 | 
						|
    while (swig_this(contours))
 | 
						|
      cvDrawContours( g.markers, contours, cvScalarAll(comp_count+1), \
 | 
						|
                     cvScalarAll(comp_count+1), -1, -1, 8, cvPoint(0,0) );
 | 
						|
      contours=contours.h_next;
 | 
						|
      comp_count+=1;
 | 
						|
    endwhile
 | 
						|
    comp_count
 | 
						|
    color_tab = cvCreateMat( comp_count, 1, CV_8UC3 );
 | 
						|
    for i=0:comp_count-1,
 | 
						|
      color_tab(i) = cvScalar( mod(cvRandInt(rng),180) + 50,  \
 | 
						|
                              mod(cvRandInt(rng),180) + 50,  \
 | 
						|
                              mod(cvRandInt(rng),180) + 50 );
 | 
						|
    endfor
 | 
						|
    t = int32(cvGetTickCount());
 | 
						|
    cvWatershed( g.img0, g.markers );
 | 
						|
    t = int32(cvGetTickCount()) - t;
 | 
						|
    ##print "exec time = %f" % t/(cvGetTickFrequency()*1000.)
 | 
						|
 | 
						|
    cvSet( g.wshed, cvScalarAll(255) );
 | 
						|
 | 
						|
    ## paint the watershed image
 | 
						|
    for j=0:g.markers.height-1,
 | 
						|
      for i=0:g.markers.width-1,
 | 
						|
	{j,i}
 | 
						|
	idx = g.markers({j,i});
 | 
						|
	if (idx==-1)
 | 
						|
          continue
 | 
						|
	endif
 | 
						|
	idx = idx-1;
 | 
						|
	g.wshed({j,i}) = color_tab({idx,0});
 | 
						|
      endfor
 | 
						|
    endfor
 | 
						|
 | 
						|
    cvAddWeighted( g.wshed, 0.5, g.img_gray, 0.5, 0, g.wshed );
 | 
						|
    cvShowImage( "watershed transform", g.wshed );
 | 
						|
    cvWaitKey();
 | 
						|
  endif
 | 
						|
endwhile
 |