function [ro, go, bo] = remove_ellipse(ri, gi, bi) % REMOVE_ELLIPSE Removes the ellipse from a headtracking % RGB or greyscale image. % [R2,G2,B2]=REMOVE_ELLIPSE(R1,G1,B1) removes % a pure red ellipse (255,0,0) from an RGB image % IMG2=REMOVE_ELLIPSE(IMG1) removes % a pure white ellipse (255) from a greyscale image % IMG2=REMOVE_ELLIPSE(IMG1,COLOR) removes % a pure white ellipse (COLOR) from a greyscale image % author: Stan Birchfield, birchfield@cs.stanford.edu % date: February 10, A.D. 1998 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sz = size(ri); %%% Greyscale if (nargin==1 | nargin==2) & nargout==1, ro=ri; if nargin==2, ellipse_color = gi; else ellipse_color = 255; end for j=2:sz(1)-1, for i=2:sz(2)-1, if ri(j, i) == ellipse_color, small = img(j-1:j+1, i-1:i+1); mask = small~=ellipse_color; ro(j, i) = sum(sum(small .* mask)) / ... sum(sum(mask)); end end end %%% RGB elseif nargin==3 & nargout==3, ro=ri; go=gi; bo=bi; for j=2:sz(1)-1, for i=2:sz(2)-1, if ri(j,i)==255 & gi(j,i)==0 & bi(j,i)==0, small_r = ri(j-1:j+1, i-1:i+1); small_g = gi(j-1:j+1, i-1:i+1); small_b = bi(j-1:j+1, i-1:i+1); mask = small_r~=255 | small_g~=0 | small_b~=0; ro(j, i) = sum(sum(small_r .* mask)) / sum(sum(mask)); go(j, i) = sum(sum(small_g .* mask)) / sum(sum(mask)); bo(j, i) = sum(sum(small_b .* mask)) / sum(sum(mask)); end end end else error('Number of arguments is invalid') end