static double
compute_surface_sse(MRI_SURFACE *mris, MRI *mri, float sample_dist) {
  int       vno, nsamples ;
  VERTEX    *v ;
  float     sse, dist ;
  Real      val, xw, yw, zw, x, y, z, nx, ny, nz, error ;

  for (nsamples = 0, sse = 0.0, vno = 0 ; vno < mris->nvertices ; vno++) {
    v = &mris->vertices[vno] ;
    if (v->ripflag)
      continue ;

    if (!finite(v->x) || !finite(v->y) || !finite(v->z))
      DiagBreak() ;
    // sample outside - want bright stuff out here
    nx = v->nx ;
    ny = v->ny ;
    nz = v->nz ;
    for (error = 0.0, dist = 0 ; dist <= sample_dist ; dist += DELTA) {
      x = v->x + dist*nx ;
      y = v->y + dist*ny ;
      z = v->z + dist*nz ;
      MRISvertexToVoxel(mris, v, mri, &xw, &yw, &zw);
      MRIsampleVolume(mri, xw, yw, zw, &val) ;
      val = 1000-val ;
      error += (val*val) ;
      nsamples++ ;
    }
    // sample inwards - want dark stuff
    for (dist = DELTA ; dist <= sample_dist ; dist += DELTA) {
      x = v->x - dist*nx ;
      y = v->y - dist*ny ;
      z = v->z - dist*nz ;
      MRISvertexToVoxel(mris, v, mri, &xw, &yw, &zw);
      MRIsampleVolume(mri, xw, yw, zw, &val) ;
      val = 0-val ;
      error += 100*(val*val) ;
      nsamples++ ;
    }
    sse += error / (float)nsamples ;
  }

  return(sse) ;
}
static int
compute_rigid_gradient(MRI_SURFACE *mris, MRI *mri, double *pdx, double *pdy, double *pdz) {
  int    vno ;
  VERTEX *v ;
  Real   val, xw, yw, zw, dx, dy, dz, delV, x, y, z, Ix, Iy, Iz, xv, yv, zv ;

  dx = dy = dz = 0.0 ;
  for (vno = 0 ; vno < mris->nvertices ; vno++) {
    v = &mris->vertices[vno] ;
    if (v->ripflag)
      continue ;
    if (vno == Gdiag_no)
      DiagBreak() ;
    x = v->x ;
    y = v->y ;
    z = v->z ;

    MRISvertexToVoxel(mris, v, mri, &xw, &yw, &zw);
    MRIsampleVolume(mri, xw, yw, zw, &val) ;

    MRIsampleVolumeGradient(mri, xw, yw, zw,  &Ix, &Iy, &Iz) ;
    // convert back to surface coords
    xw += Ix ;
    yw += Iy ;
    zw += Iz ;
    if (mris->useRealRAS)
      MRIvoxelToWorld(mri, xw, yw, zw, &xv, &yv, &zv) ;
    else
      MRIvoxelToSurfaceRAS(mri, xw, yw, zw, &xv, &yv, &zv) ;
    Ix = xv-v->x ;
    Iy = yv-v->y;
    Iz = zv-v->z ;

    delV = v->val - val ;

    dx += delV * Ix ;
    dy += delV * Iy ;
    dz += delV * Iz ;
    if (!finitep((float)dx))
      DiagBreak() ;
    if (!finitep((float)dy))
      DiagBreak() ;
    if (!finitep((float)dz))
      DiagBreak() ;
  }
  dx /= mris->nvertices ;
  dy /= mris->nvertices ;
  dz /= mris->nvertices ;
  *pdx = dx ;
  *pdy = dy ;
  *pdz = dz ;
  return(NO_ERROR) ;
}
static double
compute_surface_dist_sse(MRI_SURFACE *mris, MRI *mri) {
  double sse = 0.0 ;
  int    vno ;
  VERTEX *v ;
  Real   val, error, xw, yw, zw ;

  for (vno = 0, sse = 0.0 ; vno < mris->nvertices ; vno++) {
    v = &mris->vertices[vno] ;
    if (v->ripflag)
      continue ;
    if (vno == Gdiag_no)
      DiagBreak() ;

    MRISvertexToVoxel(mris, v, mri, &xw, &yw, &zw);
    MRIsampleVolume(mri, xw, yw, zw, &val) ;
    error = v->val - val ;
    sse += error*error ;
  }

  return(sse) ;
}
示例#4
0
文件: fcd.c 项目: vgurev/freesurfer
static int
augment_thicknesses(FCD_DATA *fcd, 
                    MRI *mri_pvals,
                    double min_dist,
                    double max_dist,
                    double thresh)
{
  int         h, vno ;
  VERTEX      *v ;
  MRI_SURFACE *mris ;
  MRI         *mri_thickness ;
  double      nx, ny, nz, x0, y0, z0, d, x, y, z, val ;
  MRI_SEGMENTATION *mriseg ;

  mriseg = MRIsegment(mri_pvals, thresh, 1e10) ;
  MRIeraseSmallSegments(mriseg, mri_pvals, 20) ;
  MRIremoveSmallSegments(mriseg, 100) ;
  if (Gdiag & DIAG_WRITE)
  {
    MRIwrite(mri_pvals, "pvals.mgz") ;
  }
  MRIsegmentFree(&mriseg) ;

  for (h = 0 ; h <= 1 ; h++)  // do each hemi
  {
    if (h == 0)  // left hemi
    {
      mri_thickness = fcd->lh_thickness_on_lh ;
      mris = fcd->mris_lh ;
    }
    else   // right hemi
    {
      mri_thickness = fcd->rh_thickness_on_rh ;
      mris = fcd->mris_rh ;
    }
    for (vno = 0 ; vno < mris->nvertices ; vno++)
    {
      if (vno == Gdiag_no)
      {
        DiagBreak() ;
      }
      v = &mris->vertices[vno] ;
      if (v->ripflag)
      {
        continue ;
      }
      MRISvertexNormalInVoxelCoords(mris, mri_pvals, vno, &nx, &ny, &nz) ;
      MRISvertexToVoxel(mris, v, mri_pvals, &x0, &y0, &z0) ;

      for (d = 0 ; d <= max_dist ; d += 0.5)
      {
        x = x0+d*nx ;
        y = y0+d*ny ;
        z = z0+d*nz ;
        MRIsampleVolume(mri_pvals, x, y, z, &val) ;
        if (val < thresh)
        {
          break ;
        }
      }
	
      if (d > min_dist)   // a string of unlikely values
      {
        val = MRIgetVoxVal(mri_thickness, vno, 0, 0, 0) ;
        MRIsetVoxVal(mri_thickness, vno, 0, 0, 0, val+d) ;
      }
    }
  }
  return(NO_ERROR) ;
}