www.pudn.com > jseg.rar > segment.c
#include#include #include #include #include "mathutil.h" #include "imgutil.h" #include "memutil.h" #include "ioutil.h" #include "segment.h" int MM=0; unsigned char *rmap9; char tmpfname[200]; int segment(unsigned char *rmap0,unsigned char *cmap,int N,int nt,int ny,int nx, unsigned char *RGB,char *outfname,char *exten,int type,int dim,int NSCALE, float displayintensity,int verbose,int tt) { float MINRSIZE[5]; int scale[5],offset[5],step[5],MAXSCALE,MINSCALE,*count,TR,i,j,k,l; int oldTR,extraTR,*reg,*reg2,*convert,datasize,autoscale; char fname[200]; short *rmap; printf("start segmentation\n"); scale[0]=32; offset[0]=2; step[0]=1; /* not used */ scale[1]=64; offset[1]=4; step[1]=1; scale[2]=128; offset[2]=8; step[2]=2; scale[3]=256; offset[3]=16; step[3]=4; scale[4]=512; offset[4]=32; step[4]=8; for (i=4;i>=1;i--) { if (ny*nx>=sqr(scale[i])) { MAXSCALE=i; break; } } if (i==0) { printf("minimum image size 64x64\n"); return 0; } if (nt==1) { for (i=0;i<=MAXSCALE;i++) MINRSIZE[i]=2.0*sqr(offset[i]); } if (nt>1) { for (i=0;i<=MAXSCALE;i++) MINRSIZE[i]=sqr(offset[i]); } if (NSCALE>0) { autoscale=0; MINSCALE=MAXSCALE-NSCALE+1; if (MINSCALE<=0) { MINSCALE=1; NSCALE=MAXSCALE-MINSCALE+1; } } else if (NSCALE==-1) { autoscale=1; if (MAXSCALE>=2) { MINSCALE = 2; NSCALE=MAXSCALE-MINSCALE+1; if (NSCALE>2) { NSCALE = 2; MINSCALE=MAXSCALE-NSCALE+1; } } else { MINSCALE = 1; NSCALE = 1; } } datasize = nt*ny*nx; rmap=(short *)calloc(datasize,sizeof(short)); for (l=0;l =MINSCALE;i--) { for (l=0;l 1) printf("init %d TR=%d %f\n",i,TR,MINRSIZE[i]); reg = (int *) calloc(oldTR+1,sizeof(int)); reg2 = (int *) calloc(TR+1,sizeof(int)); for (l=0;l 1) tempofilt(rmap0,nt,ny,nx,N,cmap,offset,step); count = (int *)calloc(TR+1,sizeof(int)); for (l=0;l 1) printf("redo "); oldTR=TR; convert = (int *)calloc(oldTR+1,sizeof(int)); for (j=1;j<=oldTR;j++) convert[j] = j; for (j=1;j<=oldTR;j++) { if (count[j]>tt*sqr(scale[i])/8 && reg2[j]==-1) { if (verbose || nt>1) printf("j=%d ",j); convert[j]=0; TR --; for (k=j+1;k<=oldTR;k++) convert[k]--; } } if (TR oldTR-TR) { reg2 = (int *) realloc(reg2,(TR+extraTR+1)*sizeof(int)); reg = (int *)calloc(oldTR+1,sizeof(int)); for (j=1;j<=oldTR;j++) reg2[convert[j]]=reg2[j]; for (j=TR+1;j<=TR+extraTR;j++) reg2[j]=0; for (l=0;l 0) { k = TR+rmap[l]; rmap0[l] = k; if (reg[j]==0) reg[j] = k; else if (reg[j]==-1) reg2[k]=-1; else if (reg[j]!=k) { reg2[k]=-1; reg2[reg[j]]=-1; reg[j]=-1; } } else if (rmap[l]==0) rmap0[l]=0; else rmap0[l] = convert[j]; } free(reg); } TR+=extraTR; } free (convert); if (TR>oldTR) { if (nt>1) tempofilt(rmap0,nt,ny,nx,N,cmap,offset,step); count = (int *)realloc(count,(TR+1)*sizeof(int)); for (j=1;j<=TR;j++) count[j]=0; for (l=0;l 1) printf("TR=%d \n",TR); } while (oldTR!=TR); free(count); free(reg2); oldTR=TR; if (verbose) outputEdge(outfname,exten,RGB,rmap0,ny,nx,i,type,dim,displayintensity); printf("%d TR=%d\n",i,TR); } if (autoscale==1 && MINSCALE>1 && NSCALE<3 && nt==1) { i = MINSCALE-1; TR=segment2(rmap0,rmap,i,cmap,N,nt,ny,nx,tt,oldTR,MINRSIZE,offset,step,verbose); if (verbose) { if (verbose || nt>1) printf("TR=%d \n",TR); outputEdge(outfname,exten,RGB,rmap0,ny,nx,i,type,dim,displayintensity); } } free(rmap); return TR; } int segment2(unsigned char *rmap0,short *rmap,int i,unsigned char *cmap,int N,int nt, int ny,int nx,int tt,int oldTR,float *MINRSIZE,int *offset,int *step,int verbose) { float oldJ[256],**mapmatrix,*change,**P; int TR,j,k,l,*convert,imgsize,*count,extraTR; int debug=0; imgsize = ny*nx; for (k=0;k<256;k++) oldJ[k]=0; mapmatrix = (float **)fmatrix(oldTR+1,N+1); gettotalJS(cmap,N,ny,nx,rmap0,oldTR,oldJ,mapmatrix,oldTR); count = (int *)calloc(oldTR+1,sizeof(int)); P = (float **)fmatrix(oldTR+1,N); for (l=0;l 2*MINRSIZE[i]) change[j]=1.0; } if (debug) { if (change[j]>1.0 || oldJ[j]>1.0) { printf("%d ",j); for (k=0;k 0.01) printf("%1.0f %1.0f; ",mapmatrix[j][k],P[j][k]); } printf("%1.0f %4.2f \n",mapmatrix[j][N],oldJ[j]); } } } /* printf("%d %d %d\n",rmap0[60*352+140],rmap0[151*352+112],rmap0[202*352+348]); */ TR=oldTR; for (j=1;j<=oldTR;j++) convert[j]=j; for (j=1;j<=oldTR;j++) { if (change[j]>=1.0 || oldJ[j]>1.0) { convert[j]=0; for (k=j+1;k<=oldTR;k++) convert[k]--; TR--; } } for (l=0;l 0) rmap[l]=-1; else rmap[l]=0; } extraTR=segment1(cmap,N,nt,ny,nx,offset,step,rmap,rmap0,oldTR,i,MINRSIZE[i],0,tt); for (l=0;l 0) rmap0[l]=rmap[l]+TR; else rmap0[l]=convert[rmap0[l]]; } TR += extraTR; if (verbose) printf("init %d TR=%d %f\n",i,TR,MINRSIZE[i]); free(count); free(convert); free(change); free_fmatrix(P,oldTR+1); free_fmatrix(mapmatrix,oldTR+1); return TR; } int segment1(unsigned char *cmap,int N,int nt,int ny,int nx,int *offset,int *step, short *rmap,unsigned char *rmap0,int oldTR,int i,float MINRSIZE,int redo,int tt) { float *J,*JT,**threshJ1,**threshJ2; int j,TR,**done,alldone,datasize,it,imgsize,l; imgsize = ny*nx; datasize = nt*ny*nx; J = (float *)calloc(datasize,sizeof(float)); for (it=0;it 1) { JT = (float *)calloc(datasize-imgsize,sizeof(float)); for (it=0;it 1) free(JT); removehole(rmap,nt,ny,nx,rmap0); alldone=getrmap2(rmap,J,nt,ny,nx,TR,oldTR,rmap0,done); if (alldone =MAX(i-2,1);j--) { for (it=0;it 0) rmap9[l]=rmap1[l]+1; else if (rmap1[l]==0) rmap9[l]=1; } outputimgraw(tmpfname,rmap9,ny,nx,1); free(rmap9); } */ rmap1 += imgsize; rmap0 += imgsize; J += imgsize; st=1; while (TR==0 && st<=nt-tt) { TR=getrmap3(rmap1,J,ny,nx,threshJ1[st],0,MINRSIZE,rmap0,n2bgrow,threshJ2[st], oldTR,appear[st]); rmap1 += imgsize; rmap0 += imgsize; J += imgsize; JT += imgsize; st++; } if (st>nt-tt+1) return TR; tracklen = (int *) calloc(TR+1,sizeof(int)); for (i=1;i<=TR;i++) tracklen[i]=1; threshJ3 = (float **)fmatrix(TN,oldTR+1); for (k=0;k TR) TR4[k]=track1(&(tracklen1[k]),TR,TR2,imgsize,rmap1-imgsize,rmap2[k], JT,rmap0,convert[k],&(TR1[k]),&(newTR[k])); /* if (MM==1) { printf("k=%d TR2=%d TR1=%d newTR=%d TR4=%d\n",k,TR2,TR1[k],newTR[k],TR4[k]); for (i=1;i<=TR2;i++) printf("%d ",convert[k][i]); printf("\n"); } */ } piksrtint(TN,TR4,index); if (TR4[0]>=0) { for (k=0;k TR) TR4[k]=track1(&(tracklen1[k]),TR,TR2,imgsize,rmap1-imgsize,rmap2[k], JT,rmap0,convert[k],&(TR1[k]),&(newTR[k])); } /* if (MM==1) { rmap9=(unsigned char *)calloc(imgsize,sizeof(unsigned char)); sprintf(tmpfname,"rmap.%d.%d.gray",it,j); for (l=0;l 0) rmap9[l]=200; else if (rmap0[l]==j) rmap9[l]=100; } outputimgraw(tmpfname,rmap9,ny,nx,1); free(rmap9); } */ if (TR1[index[0]]>0) { if (newTR[index[0]] 0) rmap[l]=convert[index[0]][rmap[l]]; } for (l=0;l 0) rmap1[l]=convert[index[0]][rmap1[l]]; } } for (l=0;l 0) rmap1[l]=convert[index[0]][rmap2[index[0]][l]]; } tracklen=(int *) realloc(tracklen,(TR1[index[0]]+1)*sizeof(int)); for (i=1;i<=TR1[index[0]];i++) tracklen[i]=tracklen1[index[0]][i]; TR = TR1[index[0]]; if (MM==1) { printf("index=%d TR=%d Track ",index[0],TR); for (i=1;i<=TR;i++) printf("%d ",tracklen[i]); printf("\n"); } } for (k=0;k 0) rmap9[l]=rmap1[l]+1; else if (rmap1[l]==0) rmap9[l]=1; } outputimgraw(tmpfname,rmap9,ny,nx,1); free(rmap9); } */ rmap1 += imgsize; rmap0 += imgsize; J += imgsize; JT += imgsize; } free_fmatrix(threshJ3,TN); for (k=0;k 0) rmap[l]=convert1[rmap[l]]; } } free(convert1); free(tracklen); /* rmap1 = rmap; rmap0 = rmap00; check1=(int *) calloc(oldTR+1,sizeof(int)); printf("recheck\n"); for (it=0;it 0) check1[rmap0[l]]=1; } for (i=1;i<=oldTR;i++) { if (appear[it][i] && check1[i]==0) printf("it=%d %d\n",it,i); } rmap1 += imgsize; rmap0 += imgsize; } free(check1); */ free_imatrix(appear,nt); return TR3; } int track1(int **tracklen,int TR,int TR2,int imgsize,short *rmap1,short *rmap2, float *JT,unsigned char *rmap0,int *convert,int *TR1,int *newTR) { int **neigh,i,j,k,l,l1,m,TR4,*appear,Tappear,*tracked; /* printf("TR=%d TR2=%d \n",TR,TR2); */ appear = (int *)calloc(TR+1,sizeof(int)); neigh = (int **)imatrix(TR+1,TR2+1); for (l=0;l 0) { appear[rmap1[l]]=1; if (rmap2[l]>0 && JT[l]<0.2) { if (rmap0[l]==rmap0[l1]) neigh[rmap1[l]][rmap2[l]] = 1; } } } tracked = (int *)calloc(TR+1,sizeof(int)); TR4=0; Tappear=0; for (i=1;i<=TR;i++) { Tappear+=appear[i]; for (j=TR+1;j<=TR2;j++) { if (neigh[i][j] == 1) { (*tracklen)[i]++; TR4++; tracked[i]=1; break; } } } free(appear); TR4 = TR4-Tappear; *TR1 = TR2; for (i=1;i<=TR;i++) { for (j=TR+1;j<=TR2;j++) { if (neigh[i][j] == 1) { for (k=j+1;k<=TR2;k++) { if (convert[k]>convert[j]) convert[k]--; } convert[j] = i; for (k=i+1;k<=TR;k++) { if (neigh[k][j] == 1) { neigh[i][k] = neigh[k][i] = 1; neigh[k][j] = 0; } } (*TR1)--; } } } /* printf("TR4=%d\n",TR4); */ *tracklen = (int *) realloc(*tracklen,((*TR1)+1)*sizeof(int)); for (i=TR+1;i<=(*TR1);i++) (*tracklen)[i]=1; *newTR=TR; do { m=0; for (i=1;i<(*newTR);i++) { for (j=i+1;j<=(*newTR);j++) { if (neigh[i][j]==1) { /* if (tracked[j]) TR4--; */ TR4--; for (k=1;k<=TR2;k++) { if (convert[k]==j) convert[k]=i; else if (convert[k]>j) convert[k]--; } (*tracklen)[i] = MAX((*tracklen)[i],(*tracklen)[j]); for (k=j+1;k<=(*TR1);k++) (*tracklen)[k-1] = (*tracklen)[k]; for (k=1;k<=(*newTR);k++) { if (k!=i && k!=j) { if (neigh[j][k]==1) { neigh[i][k] = neigh[k][i] = 1; } } } for (k=1;k<=(*newTR);k++) for (l=j+1;l<=(*newTR);l++) neigh[k][l-1]=neigh[k][l]; for (k=j+1;k<=(*newTR);k++) { for (l=1;l<=(*newTR)-1;l++) neigh[k-1][l]=neigh[k][l]; tracked[k-1]=tracked[k]; } (*newTR)--; (*TR1)--; m = 1; } } } } while (m==1); free(tracked); free_imatrix(neigh,TR+1); return TR4; } int merge1(unsigned char *rmap,unsigned char *cmap,int N,int nt,int ny,int nx,int TR, float threshcolor) { int it,iy,ix,ir,jr,i,mini,minj,newtr,*npt,npttotal; float *currentJ,*mergeJ,mindist,**distnpt,**distcolor,**distJ,**unused,**P; int loc,loc1,l,datasize,imgsize,*convert,threshtr; unsigned char *rmap1,*rmap2; float oldoverallJ,overallJ; int debug=0; if (threshcolor>=0) { TR=merge(rmap,cmap,N,nt,ny,nx,TR,threshcolor,0); return TR; } threshcolor=0.5; threshtr = TR; imgsize = ny*nx; datasize = nt*imgsize; distnpt=(float **)fmatrix(TR+1,TR+1); distJ=(float **)fmatrix(TR+1,TR+1); distcolor=(float **)fmatrix(TR+1,TR+1); loc=0; for (it=0;it 1) printf("%d %d %f \n",ir,jr,distJ[ir][jr]); } } } convert = (int *)calloc(TR+1,sizeof(int)); for (i=1;i<=TR;i++) convert[i]=i; newtr=TR; while (mindist 1) printf("min %d %d %f %f %f\n",mini,minj,currentJ[mini],currentJ[minj],mindist); overallJ = overallJ-(npt[mini]*currentJ[mini]+npt[minj]*currentJ[minj])/datasize; npttotal = npt[mini] + npt[minj]; for (i=0;i 1) printf("%d %d %f %f %f %f\n",mini,ir,distJ[mini][ir],currentJ[mini],currentJ[ir],mergeJ[1]); } } } for (i=1;i<=TR;i++) { if (convert[i]>minj) convert[i]--; } for (ir=minj+1;ir<=newtr;ir++) { npt[ir-1]=npt[ir]; currentJ[ir-1]=currentJ[ir]; for (i=0;i threshtr) { for (i=1;i<=TR;i++) { if (convert[i]==minj) convert[i]=mini; else if (convert[i]>minj) convert[i]--; } npttotal = npt[mini] + npt[minj]; for (i=0;i 0) { if (appear[it-1][rmap[l]] && appear[it+1][rmap[l]]) rmap[l]=rmap[l-imgsize]; } } for (l=0;l 0) { if (rmap[l]!=rmap[l-imgsize] && appear[it-1][rmap[l]]) rmap[l]=0; else if (rmap[l]!=rmap[l+imgsize] && appear[it+1][rmap[l]]) rmap[l]=0; } } for (l=0;l 0) { if (iy-1>=0) { if (rmap[l-nx]==0) rmap2[l]=0; } if (ix-1>=0) { if (rmap[l-1] ==0) rmap2[l]=0; } if (ix+1