#! /usr/bin/env octave cv; highgui; global g; g.color_img0 = []; g.mask = []; g.color_img = []; g.gray_img0 = []; g.gray_img = []; g.ffill_case = 1; g.lo_diff = 20 g.up_diff = 20; g.connectivity = 4; g.is_color = 1; g.is_mask = 0; g.new_mask_val = 255; function ret = randint(v1, v2) ret = int32(rand() * (v2 - v1) + v1); end function update_lo( pos ) g.lo_diff = pos; endfunction function update_up( pos ) g.up_diff = pos; endfunction function on_mouse( event, x, y, flags, param ) global g; global cv; global highgui; if( !swig_this(g.color_img) ) return; endif if (event == highgui.CV_EVENT_LBUTTONDOWN) comp = cv.CvConnectedComp(); my_mask = []; seed = cvPoint(x,y); if (g.ffill_case==0) lo = 0; up = 0; flags = g.connectivity + bitshift(g.new_mask_val,8); else lo = g.lo_diff; up = g.up_diff; flags = g.connectivity + bitshift(g.new_mask_val,8) + \ cv.CV_FLOODFILL_FIXED_RANGE; endif color = CV_RGB( randint(0,255), randint(0,255), randint(0,255) ); if( g.is_mask ) my_mask = g.mask; cvThreshold( g.mask, g.mask, 1, 128, cv.CV_THRESH_BINARY ); endif if( g.is_color ) cv.cvFloodFill( g.color_img, seed, color, cv.CV_RGB( lo, lo, lo ), CV_RGB( up, up, up ), comp, flags, my_mask ); cvShowImage( "image", g.color_img ); else brightness = cvRealScalar((r*2 + g*7 + b + 5)/10); cvFloodFill( g.gray_img, seed, brightness, cvRealScalar(lo), cvRealScalar(up), comp, flags, my_mask ); cvShowImage( "image", g.gray_img ); endif printf("%i pixels were repainted\n", comp.area); if( g.is_mask ) cvShowImage( "mask", g.mask ); endif endif endfunction filename = "../c/fruits.jpg"; if (size(argv, 1)>0) filename=argv(){1}; endif g.color_img0 = cvLoadImage(filename,1); if (!swig_this(g.color_img0)) printf("Could not open %s\n",filename); exit(-1); endif printf("Hot keys:\n"); printf("\tESC - quit the program\n"); printf("\tc - switch color/grayscale mode\n"); printf("\tm - switch mask mode\n"); printf("\tr - restore the original image\n"); printf("\ts - use null-range floodfill\n"); printf("\tf - use gradient floodfill with fixed(absolute) range\n"); printf("\tg - use gradient floodfill with floating(relative) range\n"); printf("\t4 - use 4-g.connectivity mode\n"); printf("\t8 - use 8-g.connectivity mode\n"); g.color_img = cvCloneImage( g.color_img0 ); g.gray_img0 = cvCreateImage( cvSize(g.color_img.width, g.color_img.height), 8, 1 ); cvCvtColor( g.color_img, g.gray_img0, CV_BGR2GRAY ); g.gray_img = cvCloneImage( g.gray_img0 ); g.mask = cvCreateImage( cvSize(g.color_img.width + 2, g.color_img.height + 2), 8, 1 ); cvNamedWindow( "image", 1 ); cvCreateTrackbar( "g.lo_diff", "image", g.lo_diff, 255, @update_lo); cvCreateTrackbar( "g.up_diff", "image", g.up_diff, 255, @update_up); cvSetMouseCallback( "image", @on_mouse ); while (true) if( g.is_color ) cvShowImage( "image", g.color_img ); else cvShowImage( "image", g.gray_img ); endif c = cvWaitKey(0); if (c==27) printf("Exiting ...\n"); exit(0) elseif (c=='c') if( g.is_color ) print("Grayscale mode is set"); cvCvtColor( g.color_img, g.gray_img, CV_BGR2GRAY ); g.is_color = 0; else print("Color mode is set"); cvCopy( g.color_img0, g.color_img, [] ); cvZero( g.mask ); g.is_color = 1; endif elseif (c=='m') if( g.is_mask ) cvDestroyWindow( "mask" ); g.is_mask = 0; else cvNamedWindow( "mask", 0 ); cvZero( g.mask ); cvShowImage( "mask", g.mask ); g.is_mask = 1; endif elseif (c=='r') printf("Original image is restored"); cvCopy( g.color_img0, g.color_img, [] ); cvCopy( g.gray_img0, g.gray_img, [] ); cvZero( g.mask ); elseif (c=='s') printf("Simple floodfill mode is set"); g.ffill_case = 0; elseif (c=='f') printf("Fixed Range floodfill mode is set"); g.ffill_case = 1; elseif (c=='g') printf("Gradient (floating range) floodfill mode is set"); g.ffill_case = 2; elseif (c=='4') printf("4-g.connectivity mode is set"); g.connectivity = 4; elseif (c=='8') printf("8-g.connectivity mode is set"); g.connectivity = 8; endif endwhile