function [newmsk] = findocean( oldmsk, nstartpts, periodic ); [nx ny]=size(oldmsk); if periodic xp=[2:nx 1]; xm=[nx 1:nx-1]; yp=[2:ny ny]; ym=[1 1:ny-1]; else xp=[2:nx nx]; xm=[1 1:nx-1]; yp=[2:ny ny]; ym=[1 1:ny-1]; end msk=0*oldmsk; i=0; npts=nstartpts; for k=1:floor(ny/npts):ny; for j=1:floor(nx/npts):nx; if oldmsk(j,k)==1 i=i+1; msk(j,k)=i; end end; end; nmsk=i; nnz=size(find(msk==0),1); nnzo=nnz+1; nnzoo=nnzo+1; iter=0; while nnz ~= nnzoo & iter < max(nx,ny)/npts nnzoo=nnzo; nnzo=nnz; iter=iter+1; disp( sprintf('Findocean: iter=%i, num. points in ocean=%i',iter,nnz) ); pcol(sq(msk)'); drawnow; % Loop over all masks values k=1; while k<=nmsk % Procreate right ii=find(msk(xm,:)==k & msk==0 & oldmsk==1); msk(ii)=k; ii=find(msk(xm,:)==k & msk==0 & oldmsk==1); msk(ii)=k; ii=find(msk(xm,:)==k & msk==0 & oldmsk==1); msk(ii)=k; % Procreate up ii=find(msk(:,ym)==k & msk==0 & oldmsk==1); msk(ii)=k; ii=find(msk(:,ym)==k & msk==0 & oldmsk==1); msk(ii)=k; ii=find(msk(:,ym)==k & msk==0 & oldmsk==1); msk(ii)=k; % Procreate left ii=find(msk(xp,:)==k & msk==0 & oldmsk==1); msk(ii)=k; ii=find(msk(xp,:)==k & msk==0 & oldmsk==1); msk(ii)=k; ii=find(msk(xp,:)==k & msk==0 & oldmsk==1); msk(ii)=k; % Procreate down ii=find(msk(:,yp)==k & msk==0 & oldmsk==1); msk(ii)=k; ii=find(msk(:,yp)==k & msk==0 & oldmsk==1); msk(ii)=k; ii=find(msk(:,yp)==k & msk==0 & oldmsk==1); msk(ii)=k; for j=1:nmsk; if k~=j % Join left ii=find(msk(xm,:)==j & msk==k); if ~isempty(ii) msk(find(msk==j))=k; end % Join down ii=find(msk(:,ym)==j & msk==k); if ~isempty(ii) msk(find(msk==j))=k; end end end k=k+1; end nnz=size(find(msk==0),1); end % while % Find largest patch for k=1:nmsk; np(k)=prod(size(find(msk==k))); end [NP,I]=sort(np); disp('Number of points in each region:') disp( sprintf('%7i',NP') ); newmsk=0*msk; newmsk( find(msk==I(end)) )=1; if NP(end-1) > NP(end)/4 newmsk( find(msk==I(end-1)) )=1; end