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) ;
}
Пример #2
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) ;
}