Ejemplo n.º 1
0
int
IOPNormalize(IOP *iop)
{
  int j,k,jc;
  double sum, val;

  for (j=0;j<iop->ndipoles;j++)
  {
    sum = 0;
    for (jc=0;jc<iop->ndipoles_per_location;jc++)
      for (k=0;k<iop->nchan;k++)
      {
        val = *MATRIX_RELT(iop->m_iop,j*iop->ndipoles_per_location+jc+1,k+1);
        sum += SQR(val);
      }

    sum = sqrt(sum);
    if (!DZERO(sum))
    {
      for (jc=0;jc<iop->ndipoles_per_location;jc++)
        for (k=0;k<iop->nchan;k++)
          *MATRIX_RELT(iop->m_iop,j*iop->ndipoles_per_location+jc+1,k+1)/= sum;
    }
  }
  return(NO_ERROR) ;
}
static double
FLASHforwardModel(double flip_angle, double TR, double PD, double T1) {
  double FLASH, E1 ;
  double  CFA, SFA ;


  CFA = cos(flip_angle) ;
  SFA = sin(flip_angle) ;
  E1 = exp(-TR/T1) ;

  FLASH = PD * SFA ;
  if (!DZERO(T1))
    FLASH *= (1-E1)/(1-CFA*E1);
  return(FLASH) ;
}
Ejemplo n.º 3
0
static MRI *
MRIcomputeSurfaceDistanceProbabilities(MRI_SURFACE *mris,  MRI *mri_ribbon, MRI *mri, MRI *mri_aseg) 
{
  MRI          *mri_features, *mri_binary, *mri_white_dist, *mri_pial_dist, *mri_mask ;
  int          nwhite_bins, npial_bins, x, y, z, label, i ;
  HISTOGRAM2D *hw, *hp ; 
  float        pdist, wdist, val ;
  double       wval, pval ;

  mri_features = MRIallocSequence(mri->width, mri->height, mri->depth, MRI_FLOAT, 2) ;
  MRIcopyHeader(mri, mri_features) ;

  mri_binary = MRIcopy(mri_ribbon, NULL) ;
  mri_binary = MRIbinarize(mri_ribbon, NULL, 1, 0, 1) ;
  mri_pial_dist = MRIdistanceTransform(mri_binary, NULL, 1, max_pial_dist+1, DTRANS_MODE_SIGNED,NULL);
  if (Gdiag & DIAG_WRITE && DIAG_VERBOSE_ON)
    MRIwrite(mri_pial_dist, "pd.mgz") ;

  MRIclear(mri_binary) ;
  MRIcopyLabel(mri_ribbon, mri_binary, Left_Cerebral_White_Matter) ;
  MRIcopyLabel(mri_ribbon, mri_binary, Right_Cerebral_White_Matter) ;
  MRIbinarize(mri_binary, mri_binary, 1, 0, 1) ;
  mri_white_dist = MRIdistanceTransform(mri_binary, NULL, 1, max_white_dist+1, DTRANS_MODE_SIGNED,NULL);
  if (Gdiag & DIAG_WRITE && DIAG_VERBOSE_ON)
    MRIwrite(mri_white_dist, "wd.mgz") ;

  nwhite_bins = ceil((max_white_dist - min_white_dist) / white_bin_size)+1 ;
  npial_bins = ceil((max_pial_dist - min_pial_dist) / pial_bin_size)+1 ;
  hw = HISTO2Dalloc(NBINS, nwhite_bins) ;
  hp = HISTO2Dalloc(NBINS, npial_bins) ;

  HISTO2Dinit(hw, NBINS, nwhite_bins, 0, NBINS-1, min_white_dist, max_white_dist) ;
  HISTO2Dinit(hp, NBINS, npial_bins, 0, NBINS-1, min_pial_dist, max_pial_dist) ;

  for (x = 0 ; x < mri->width ; x++)
    for (y = 0 ; y < mri->height ; y++)
      for (z = 0 ; z < mri->depth ; z++)
      {
	label = MRIgetVoxVal(mri_aseg, x, y, z, 0) ;
	if (IS_CEREBELLUM(label) || IS_VENTRICLE(label) || label == Brain_Stem || IS_CC(label))
	  continue ;
	pdist = MRIgetVoxVal(mri_pial_dist, x, y, z, 0) ;
	wdist = MRIgetVoxVal(mri_pial_dist, x, y, z, 0) ;
	val  = MRIgetVoxVal(mri, x, y, z, 0) ;
	if (pdist >= min_pial_dist && pdist <= max_pial_dist)
	  HISTO2DaddSample(hp, val, pdist, 0, 0, 0, 0) ;
	if (wdist >= min_white_dist && wdist <= max_white_dist)
	  HISTO2DaddSample(hw, val, wdist, 0, 0, 0, 0) ;
      }
  HISTO2DmakePDF(hp, hp) ;
  HISTO2DmakePDF(hw, hw) ;
  for (x = 0 ; x < mri->width ; x++)
    for (y = 0 ; y < mri->height ; y++)
      for (z = 0 ; z < mri->depth ; z++)
      {
	label = MRIgetVoxVal(mri_aseg, x, y, z, 0) ;
	if (IS_CEREBELLUM(label) || IS_VENTRICLE(label) || label == Brain_Stem || IS_CC(label))
	  continue ;
	pdist = MRIgetVoxVal(mri_pial_dist, x, y, z, 0) ;
	wdist = MRIgetVoxVal(mri_pial_dist, x, y, z, 0) ;
	val  = MRIgetVoxVal(mri, x, y, z, 0) ;
	wval = HISTO2DgetCount(hw, val, wdist);
	if (DZERO(wval) == 0)
	  MRIsetVoxVal(mri_features, x, y, z, 1, -log10(wval)) ;
	pval = HISTO2DgetCount(hp, val, pdist);
	if (DZERO(pval) == 0)
	  MRIsetVoxVal(mri_features, x, y, z, 0, -log10(pval)) ;
      }

  MRIclear(mri_binary) ;
  MRIbinarize(mri_ribbon, mri_binary, 1, 0, 1) ;
  mri_mask = MRIcopy(mri_binary, NULL) ;
  for (i = 0 ; i < close_order ; i++)
  {
    MRIdilate(mri_binary, mri_mask) ;
    MRIcopy(mri_mask, mri_binary) ;
  }
  
  for (i = 0 ; i < close_order ; i++)
  {
    MRIerode(mri_binary, mri_mask) ;
    MRIcopy(mri_mask, mri_binary) ;
  }

  MRIwrite(mri_mask, "m.mgz") ;
  MRImask(mri_features, mri_mask, mri_features, 0, 0) ;
  HISTO2Dfree(&hw) ;
  HISTO2Dfree(&hp) ;
  MRIfree(&mri_white_dist) ; MRIfree(&mri_pial_dist) ; MRIfree(&mri_binary) ;
  return(mri_features) ;
}
Ejemplo n.º 4
0
int
main(int argc, char *argv[]) {
    char               **av, fname[STRLEN], *subject_name, *wfile_name,
                       *cp, *hemi ;
    int                ac, nargs, vno ;
    MRI_SURFACE        *mris ;
    VERTEX             *v ;
    double             entropy, total_len, min_w ;

    /* rkt: check for and handle version tag */
    nargs = handle_version_option (argc, argv, "$Id: mris_entropy.c,v 1.7 2011/03/02 00:04:31 nicks Exp $", "$Name:  $");
    if (nargs && argc - nargs == 1)
        exit (0);
    argc -= nargs;

    Progname = argv[0] ;
    ErrorInit(NULL, NULL, NULL) ;
    DiagInit(NULL, NULL, NULL) ;

    ac = argc ;
    av = argv ;
    for ( ; argc > 1 && ISOPTION(*argv[1]) ; argc--, argv++) {
        nargs = get_option(argc, argv) ;
        argc -= nargs ;
        argv += nargs ;
    }

    if (argc < 3)
        print_help() ;

    subject_name = argv[1] ;
    hemi = argv[2] ;
    wfile_name = argv[3] ;

    if (strlen(sdir) == 0) {
        cp = getenv("SUBJECTS_DIR") ;
        if (!cp)
            ErrorExit(ERROR_UNSUPPORTED, "%s: must specifiy SUBJECTS_DIR in env",
                      Progname) ;
        strcpy(sdir, cp) ;
    }
    sprintf(fname, "%s/%s/surf/%s.%s", sdir, subject_name, hemi, ORIG_NAME) ;
    mris = MRISfastRead(fname) ;
    if (!mris)
        ErrorExit(ERROR_NOFILE, "%s: could not read surface file %s",
                  Progname, fname) ;

    if (MRISreadValues(mris, wfile_name) != NO_ERROR)
        ErrorExit(ERROR_NOFILE, "%s: could not read w file %s",
                  Progname, wfile_name) ;

    if (navgs > 0) {
        printf("smoothing surface values for %d iterations...\n",navgs) ;
        MRISaverageVals(mris, navgs) ;
    }

    min_w = fabs(mris->vertices[0].val) ;
    for (total_len = vno = 0 ; vno < mris->nvertices ; vno++) {
        v = &mris->vertices[vno] ;
        if (v->ripflag)
            continue ;
        v->val = fabs(v->val) ;
        total_len += (v->val*v->val) ;
        if (v->val < min_w)
            min_w = v->val ;
    }

    total_len = sqrt(total_len) ;
    if (FZERO(total_len))
        ErrorExit(ERROR_BADPARM, "total vector len = 0, entropy = 0 (trivial case)") ;

    for (entropy = vno = 0 ; vno < mris->nvertices ; vno++) {
        v = &mris->vertices[vno] ;
        if (v->ripflag)
            continue ;
        if (DZERO(v->val))
            continue ;
        v->val = v->val / total_len ;
        entropy += v->val * log2(v->val) ;
    }

    entropy = -entropy ;
    printf("total entropy = %f\n", entropy) ;
    if (log_fname) {
        FILE *fp ;

        fp = fopen(log_fname, "a") ;
        if (!fp)
            ErrorExit(ERROR_NOFILE, "%s: could not open log file %s\n", Progname,log_fname) ;
        fprintf(fp, "%f\n", entropy) ;
        fclose(fp) ;
    }
    exit(0) ;
    return(0) ;  /* for ansi */
}
Ejemplo n.º 5
0
static MRI *
MRIfindInnerBoundary(MRI *mri_src, MRI *mri_grad, MRI *mri_dst, float dist) {
  int    x, y, z, nsamples  ;
  double x1, y1, z1, dx, dy, dz, dot, d, inside, outside, norm, val, xc, yc, zc, wt ;

  if (mri_dst == NULL)
    mri_dst = MRIclone(mri_src, NULL) ;

  xc = yc = zc = 0.0 ;
  for (wt = 0.0, x = 0 ; x < mri_src->width ; x++) {
    for (y = 0 ; y < mri_src->height ; y++) {
      for (z = 0 ; z < mri_src->depth ; z++) {
        val = MRIgetVoxVal(mri_src, x, y, z, 0) ;
        xc += val*x ;
        yc += val*y ;
        zc += val*z ;
        wt += val ;
      }
    }
  }
  xc /= wt ;
  yc /= wt ;
  zc /= wt ;

  for (x = 0 ; x < mri_src->width ; x++) {
    for (y = 0 ; y < mri_src->height ; y++) {
      for (z = 0 ; z < mri_src->depth ; z++) {
        if (x == Gx && y == Gy && z == Gz)
          DiagBreak() ;
        dx = MRIgetVoxVal(mri_grad, x, y, z, 0) ;
        dy = MRIgetVoxVal(mri_grad, x, y, z, 1) ;
        dz = MRIgetVoxVal(mri_grad, x, y, z, 2) ;
        norm = sqrt(dx*dx + dy*dy + dz*dz) ;
        if (DZERO(norm))
          continue ;
        dx /= norm ;
        dy /= norm ;
        dz /= norm ;
        dot = dx * (x-xc) + dy * (y-yc) + dz * (z-zc);
        if (dot < 0)
          continue ;
        for (nsamples = 0, outside = 0, d = .1 ; d < dist ; d += 0.1, nsamples++) {
          x1 = x+d*dx ;
          y1 = y+d*dy ;
          z1 = z+d*dz ;
          MRIsampleVolume(mri_src, x1, y1, z1, &val) ;
          outside += val ;
        }
        for (nsamples = 0, inside = 0, d = .1 ; d < dist ; d += 0.1, nsamples++) {
          x1 = x-d*dx ;
          y1 = y-d*dy ;
          z1 = z-d*dz ;
          MRIsampleVolume(mri_src, x1, y1, z1, &val) ;
          inside += val ;
        }
        outside /= nsamples ;
        inside /= nsamples ;
        MRIsetVoxVal(mri_dst, x, y, z, 0, outside-inside) ;
      }
    }
  }

  return(mri_dst) ;
}
Ejemplo n.º 6
0
static MRI *
build_distance_by_intensity_histo(MRI *mri_norm,
                                  MRI *mri_dist,
                                  MRI *mri_aseg,
                                  double dist_spacing,
                                  double max_dist)
{
  HISTOGRAM2D *h_dist_by_int ;
  int         x, y, z, b1, b2, label ;
  float       val, dist ;
  double      total, unlikely, pval ;
  MRI         *mri_pvals ;

  h_dist_by_int = HISTO2Dalloc((int)ceil(max_dist/dist_spacing), 256) ;
  HISTO2Dinit(h_dist_by_int,
              h_dist_by_int->nbins1,
              h_dist_by_int->nbins2,
              0,
              MAX_DIST,
              0,
              255) ;
  for (x = 0 ; x < mri_dist->width ; x++)
    for (y = 0 ; y < mri_dist->height ; y++)
      for (z = 0 ; z < mri_dist->depth ; z++)
      {
        if (x == Gx && y == Gy && z == Gz)
        {
          DiagBreak() ;
        }
        dist = MRIgetVoxVal(mri_dist, x, y, z, 0) ;
        if (dist < 0 || dist > MAX_DIST)  // in interior or too far away
        {
          continue ;
        }
        label = MRIgetVoxVal(mri_aseg, x, y, z, 0) ;
        if (IS_WHITE_CLASS(label) == 0 && 
            IS_CORTEX(label) == 0 && 
            label < MIN_CORTICAL_PARCELLATION)
        {
          continue ;
        }
        val = MRIgetVoxVal(mri_norm, x, y, z, 0) ;
        HISTO2DaddSample(h_dist_by_int, dist, val, 0, max_dist, 0, 255) ;
      }

  // normalize the counts for each distance
  for (b1 = 0 ; b1 < h_dist_by_int->nbins1 ; b1++)
  {
    for (total = 0.0, b2 = 0 ; b2 < h_dist_by_int->nbins2 ; b2++)
    {
      total += h_dist_by_int->counts[b1][b2] ;
    }

    if (total > 0)
    {
      unlikely = 1.0/(10*total) ;
      for (b2 = 0 ; b2 < h_dist_by_int->nbins2 ; b2++)
      {
        h_dist_by_int->counts[b1][b2]/=total ;
        if (DZERO(h_dist_by_int->counts[b1][b2]))
        {
          h_dist_by_int->counts[b1][b2] = unlikely ;
        }
      }
    }
  }

  mri_pvals = MRIclone(mri_dist, NULL) ;
  for (x = 0 ; x < mri_dist->width ; x++)
    for (y = 0 ; y < mri_dist->height ; y++)
      for (z = 0 ; z < mri_dist->depth ; z++)
      {
        if (x == Gx && y == Gy && z == Gz)
        {
          DiagBreak() ;
        }
        dist = MRIgetVoxVal(mri_dist, x, y, z, 0) ;
        if (dist < 0 || dist > MAX_DIST)  // in interior
        {
          continue ;
        }
        label = MRIgetVoxVal(mri_aseg, x, y, z, 0) ;
        if (IS_WHITE_CLASS(label) == 0 && 
            IS_CORTEX(label) == 0 && 
            label < MIN_CORTICAL_PARCELLATION)
        {
          continue ;
        }
        val = MRIgetVoxVal(mri_norm, x, y, z, 0) ;
        pval = HISTO2DgetCount(h_dist_by_int, dist, val) ;
        if (pval > 0)
        {
          pval = -log10(pval) ;
        }
        else
        {
          pval = -10000 ;
        }
        MRIsetVoxVal(mri_pvals, x, y, z, 0, pval) ;
      }

  HISTO2Dfree(&h_dist_by_int) ;
  return(mri_pvals) ;
}