⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motionseg.c

📁 image processing including fourier,wavelet,segmentation etc.
💻 C
字号:
/*--------------------------- MegaWave Command -----------------------------*//* mwcommandname = {motionseg};version = {"1.0"};author = {"Toni Buades"};function = {"Motion Segmentation (Aubert-Deriche-Kornprobst method)"};usage = { 'n':[n=100]->n             "Maximum number of iterations, default 100", 'p':[prec=0.001]->prec     "Numerical precision, default 0.001", 'e':[e=0.0005]-> e         "Parameter of relaxation, default 0.0005" , 'a':[alphac=1000]->alphac  "Parameter alphac of the functional, default 1000", 'b':[alphabr=100]->alphabr "Parameter alphabr of the fuctional, default 10", 'c':[alphacr=10]->alphacr  "Parameter alphacr of the functional, default 10", 's':[s=0.25]->seu          "threshold, default 0.25", fmov1->N                   "Original Fmovie (input)", fmov2 <- C                 "Motion segmentation (output Fmovie)" , fim <-B                    "Background estimation (output Fimage)"        };*/#include <stdio.h>#include <math.h>#include "mw.h"#define _(a,i,j)  ((a)->gray[(j)*(a)->ncol+(i)])/*--------Definition fonction de la derivee de phi epsilon-----------*//*--- On Utilise phi(t)=sqrt(1+t*t)-1 ---------------*/float dphi(x,e)     float x,e;{  if ( x<=e)  return x/ sqrt(1+e*e) ;  else if ( x<=(1./e) ) return (x/sqrt(1+x*x));  else return (e*x/sqrt(1+e*e));}/*---------------------------------------------------*//*----------- Garde memoire pour le film   ------- */void Film_Allocate( out, n,x,y )     Fmovie out;     int n,x,y;{  Fimage image,image_prev;  int l;    out = mw_change_fmovie(out);  if  (out==NULL) mwerror(FATAL,1,"Not enough memory\n");    for(l=0;l<n;l++)    {       if ( (image = mw_change_fimage(NULL, y, x))==NULL){	mw_delete_fmovie(out);	mwerror(FATAL,1,"Not enough memory\n");      }      if(l==0)	out->first=image;      else {	image_prev->next=image;   	image->previous =image_prev;      }      image_prev=image;    }  image->next=NULL;}/*-----------------------------------------*//*------Calcule d(i,j)=phi'(|gradB|)/(|gradB|)--*/void calcula_D(Orig,D,e1 )     Fimage Orig,D;     float e1;{  int x,y;  float ux,uy,mgrad,a=0.0005;    for(y=0;y<Orig->nrow;y++)    for(x=0;x<Orig->ncol;x++){      if (x==0) ux=_(Orig,x+1,y)-_(Orig,x,y);      else if (x==Orig->ncol-1)	ux=_(Orig,x,y)-_(Orig,x-1,y);      else	ux=(_(Orig,x+1,y)-_(Orig,x-1,y))*0.5;                  if (y==0) uy=_(Orig,x,y+1)-_(Orig,x,y);      else if (y==Orig->nrow-1)	uy=_(Orig,x,y)-_(Orig,x,y-1);      else	uy=(_(Orig,x,y+1)-_(Orig,x,y-1))*0.5;                        mgrad=sqrt(ux*ux+uy*uy);      _(D,x,y)=dphi(mgrad,e1)/(2*mgrad+a);    }  }/*----------------------------------------------*/void calcula_B(Orig,D,Nh,Ch,alphabr1)     Fimage Orig,D;     Fmovie Nh,Ch;     float alphabr1;{  int x,y;  Fimage u1,u2;  float dt,db,dr,dl;  float bt,bb,br,bl;  float suma,suma1,suma2;  for(y=0;y<Orig->nrow;y++)    for(x=0;x<Orig->ncol;x++){      if (x==0){	bl=0;dl=0;	br=_(Orig,x+1,y);	dr=(_(D,x+1,y)+_(D,x,y))*0.5;      }      else if (x==Orig->ncol-1){	dr=0;br=0;	bl=_(Orig,x-1,y);	dl=(_(D,x-1,y)+_(D,x,y))*0.5;      }      else {	br=_(Orig,x+1,y);	dr=(_(D,x+1,y)+_(D,x,y))*0.5;	bl=_(Orig,x-1,y);	dl=(_(D,x-1,y)+_(D,x,y))*0.5;      }                        if  (y==0) {	bt=0;dt=0;	bb=_(Orig,x,y+1);	db=(_(D,x,y)+_(D,x,y+1))*0.5;      }      else if (y==Orig->nrow-1){	bb=0;db=0;	bt=_(Orig,x,y-1);	dt=(_(D,x,y)+_(D,x,y-1))*0.5;      }       else {	bt=_(Orig,x,y-1);	dt=(_(D,x,y-1)+_(D,x,y))*0.5;	bb=_(Orig,x,y+1);	db=(_(D,x,y+1)+_(D,x,y))*0.5;      }            u1=Nh->first;      u2=Ch->first;      suma1=0;      suma2=0;      while (u1!=NULL){	suma1+=_(u1,x,y)*_(u2,x,y)*_(u2,x,y);	suma2+=_(u2,x,y)*_(u2,x,y);	u1=u1->next;	u2=u2->next;      }      suma=suma2+alphabr1*(dt+db+dl+dr);      _(Orig,x,y)=alphabr1*(1./suma)*(db*bb+dt*bt+dr*br+dl*bl)+	(suma1/suma);                      }  }/*---------------------------*/void calcula_Ch(Ch,D,Fons,Nh,alphac1,alphacr1)     Fimage Ch,D,Fons,Nh;     float alphac1,alphacr1;{  int x,y;  float dt,db,dr,dl;  float ct,cb,cr,cl;  float suma;  for(y=0;y<Ch->nrow;y++)    for(x=0;x<Ch->ncol;x++){      if (x==0){	cl=0;dl=0;	cr=_(Ch,x+1,y);	dr=(_(D,x+1,y)+_(D,x,y))*0.5;      }      else if (x==Ch->ncol-1){	dr=0;cr=0;	cl=_(Ch,x-1,y);	dl=(_(D,x-1,y)+_(D,x,y))*0.5;      }       else {	cr=_(Ch,x+1,y);	dr=(_(D,x+1,y)+_(D,x,y))*0.5;	cl=_(Ch,x-1,y);	dl=(_(D,x-1,y)+_(D,x,y))*0.5;      }                        if  (y==0) {	ct=0;dt=0;	cb=_(Ch,x,y+1);	db=(_(D,x,y)+_(D,x,y+1))*0.5;      }      else if (y==Ch->nrow-1){	cb=0;db=0;	ct=_(Ch,x,y-1);	dt=(_(D,x,y)+_(D,x,y-1))*0.5;      }       else {	ct=_(Ch,x,y-1);	dt=(_(D,x,y-1)+_(D,x,y))*0.5;	cb=_(Ch,x,y+1);	db=(_(D,x,y+1)+_(D,x,y))*0.5;      }            suma=alphac1+(_(Fons,x,y)-_(Nh,x,y))*(_(Fons,x,y)-_(Nh,x,y))+	alphacr1*(db+dt+dr+dl);            _(Ch,x,y)=alphacr1*(dt*ct+db*cb+dl*cl+dr*cr)/suma + alphac1/suma;          }  }/*------------------------------ MAIN MODULE ------------------------------*/void motionseg(n,prec,e,alphac,alphabr,alphacr,seu,N,C,B)     int *n;     float *prec,*e,*alphac,*alphabr,*alphacr,*seu;     Fmovie N, C;     Fimage B;{    int nx,ny,n_images,l,k,it;  Fimage u=NULL,Anterior=NULL,D1=NULL,v=NULL;  float *ptrB,*ptrAnt,*ptrfilm,*ptrfilm2,diff,error;        u=N->first;  n_images=0;  while (u!=NULL)    {      n_images++;      u=u->next;    }  nx = N->first->ncol;  ny = N->first->nrow;    Film_Allocate( C, n_images,nx,ny );    Anterior=mw_change_fimage(Anterior,ny,nx);  if (Anterior==NULL) mwerror(FATAL,1,"Not enough memory \n");    B=mw_change_fimage(B,ny,nx);  if (B==NULL) mwerror(FATAL,1,"Not enough memory \n");    D1=mw_change_fimage(D1,ny,nx);  if (D1==NULL) mwerror(FATAL,1,"Not enough memory \n");    /*---Initialize B to N1-------------------*/    ptrB=B->gray;    for(l=0;l<nx*ny;l++, ptrB++)    *ptrB=0;    /*---------------------------------*/      /*---Initialize C[ i ] to 1--------------------*/  u=C->first;  for (l=0;l<n_images;l++, u=u->next){    ptrfilm=u->gray;    for(k=0;k<nx*ny;k++,ptrfilm++)      *ptrfilm=1;  }  /*------------------------------------*/    error=*prec+1;  for(it=0;it<*n && error>*prec; it++){        printf("iteration %d / %d\n",it+1,*n);        mw_copy_fimage(B,Anterior);        calcula_D( B, D1,*e);        calcula_B(B,D1,N,C,*alphabr);        ptrB=B->gray;    ptrAnt=Anterior->gray;    error=0;    for(l=0;l<nx*ny;l++,ptrB++,ptrAnt++) {      if (*ptrB!=0)   diff = fabs( (double)(*ptrB-*ptrAnt)) / fabs((double)*ptrB);      else diff=fabs( (double)(*ptrB-*ptrAnt));            if (diff>error) error=diff;    }                u=C->first;    v=N->first;    for(l=0; l<n_images;l++,u=u->next,v=v->next){      mw_copy_fimage(u,Anterior);      calcula_D(u,D1);      calcula_Ch(u,D1,B,v,*alphac,*alphacr);      ptrfilm=u->gray;      ptrAnt=Anterior->gray;      for (k=0;k<nx*ny;k++,ptrfilm++,ptrAnt++){	if (*ptrfilm!=0)   diff = fabs( (double)(*ptrfilm-*ptrAnt)) / fabs((double)*ptrfilm);	else diff=fabs( (double)(*ptrfilm-*ptrAnt));		if (diff>error) error=diff;      }          }  }    u=C->first;  for (l=0;l<n_images;l++, u=u->next){    ptrfilm=u->gray;    for(k=0;k<nx*ny;k++,ptrfilm++)      if (*ptrfilm>*seu) *ptrfilm=255;      else *ptrfilm=0;  }  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -