Esempio n. 1
0
static int
discard_unlikely_control_points(GCA *gca, GCA_SAMPLE *gcas, int nsamples,
                                MRI *mri_in, TRANSFORM *transform, char *name)
{
  int    i, xv, yv, zv, n, peak, start, end, num ;
  HISTO *h, *hsmooth ;
  float  fmin, fmax ;
  Real   val,  mean_ratio ;

  if (nsamples == 0)
    return(NO_ERROR) ;

  for (num = n = 0 ; n < mri_in->nframes ; n++)
  {
    int niter = 0 ;
    MRIvalRangeFrame(mri_in, &fmin, &fmax, n) ;
    h = HISTOalloc(nint(fmax-fmin)+1) ;
    h->bin_size = (fmax-fmin)/(float)h->nbins ;
    for (i = 0 ; i < h->nbins ; i++)
      h->bins[i] = (i+1)*h->bin_size+fmin ;

    for (i = 0 ; i < nsamples ; i++)
    {
      xv = gcas[i].x ; yv = gcas[i].y ; zv = gcas[i].z ;
      if (xv == Gx && yv == Gy && zv == Gz)
        DiagBreak() ;
      MRIsampleVolumeFrame(mri_in, gcas[i].x,gcas[i].y,gcas[i].z, n, &val) ;
      if (FZERO(val))
        DiagBreak() ;
      h->counts[nint(val-fmin)]++ ;
    }

    /* check to see  if peak is unlikely */
    hsmooth = HISTOsmooth(h, NULL, 2) ;
    do
    {
      if (gca->ninputs == 1) /*  find  brightest peak as
                                 for  n=1 it is T1  weighted  */
        peak = HISTOfindLastPeak(hsmooth, HISTO_WINDOW_SIZE,MIN_HISTO_PCT);
      else
        peak = HISTOfindHighestPeakInRegion(hsmooth, 0, h->nbins-1) ;
      end = HISTOfindEndOfPeak(hsmooth, peak, 0.01) ;
      start = HISTOfindStartOfPeak(hsmooth, peak, 0.01) ;
      for (mean_ratio = 0.0, i = 0 ; i < nsamples ; i++)
      {
        mean_ratio += hsmooth->bins[peak] / gcas[i].means[0];
      }
      mean_ratio /= (Real)nsamples ;
      HISTOclearBins
        (hsmooth, hsmooth, hsmooth->bins[start], hsmooth->bins[end])  ;
      if (niter++ > 5)
        break ;
      if (niter > 1)
        DiagBreak() ;
    } while  (mean_ratio  < 0.5 || mean_ratio > 2.0) ;

    printf("%s: limiting intensities to %2.1f --> %2.1f\n",
           name, fmin+start, fmin+end) ;
    for (i = 0 ; i < nsamples ; i++)
    {
      xv = gcas[i].x ; yv = gcas[i].y ; zv = gcas[i].z ;
      if (xv == Gx && yv == Gy && zv == Gz)
        DiagBreak() ;
      MRIsampleVolumeFrame(mri_in,gcas[i].x,gcas[i].y,gcas[i].z,n,&val) ;
      if (val-fmin < start || val-fmin > end)
      {
        num++ ; gcas[i].label = 0 ;
      }
    }
    HISTOfree(&h) ; HISTOfree(&hsmooth) ;
  }

  printf("%d of %d (%2.1f%%) samples deleted\n",
         num, nsamples, 100.0f*(float)num/(float)nsamples) ;
  return(NO_ERROR) ;
}
Esempio n. 2
0
MRI *
MRIsynthesizeWeightedVolume(MRI *mri_T1, MRI *mri_PD, float w5, float TR5,
                            float w30, float TR30, float target_wm, float TE) {
  MRI        *mri_dst ;
  int        x, y, z, width, height, depth ;
  MRI        *mri30, *mri5 ;
  Real       val30, val5, val, min_val ;
#if 0
  int        mri_peak, n, min_real_bin ;
  double    mean_PD ;
  MRI_REGION box ;
  HISTOGRAM *h_mri, *h_smooth ;
  float      x0, y0, z0, min_real_val ;
#endif

  width = mri_T1->width ;
  height = mri_T1->height ;
  depth = mri_T1->depth ;
  mri_dst = MRIalloc(width, height, depth, MRI_FLOAT) ;
  MRIcopyHeader(mri_T1, mri_dst) ;
  mri30 = MRIsynthesize(mri_T1, mri_PD, NULL, NULL, TR30, RADIANS(30), TE) ;
  mri5 = MRIsynthesize(mri_T1, mri_PD, NULL, NULL, TR5, RADIANS(5), TE) ;
#if 0
  mean_PD = MRImeanFrame(mri_PD, 0) ;
  /*  MRIscalarMul(mri_PD, mri_PD, 1000.0f/mean_PD) ;*/


  h_mri = MRIhistogram(mri30, 100) ;
  h_smooth = HISTOsmooth(h_mri, NULL, 2) ;
  mri_peak = HISTOfindHighestPeakInRegion(h_smooth, 0, h_smooth->nbins) ;
  min_real_bin = HISTOfindNextValley(h_smooth, mri_peak) ;
  min_real_val = h_smooth->bins[min_real_bin] ;

  MRIfindApproximateSkullBoundingBox(mri30, min_real_val, &box) ;
  x0 = box.x+box.dx/3 ;
  y0 = box.y+box.dy/3 ;
  z0 = box.z+box.dz/2 ;
  printf("using (%.0f, %.0f, %.0f) as brain centroid...\n",x0, y0, z0) ;
  box.dx /= 4 ;
  box.x = x0 - box.dx/2;
  box.dy /= 4 ;
  box.y = y0 - box.dy/2;
  box.dz /= 4 ;
  box.z = z0 - box.dz/2;


  printf("using box (%d,%d,%d) --> (%d, %d,%d) "
         "to find MRI wm\n", box.x, box.y, box.z,
         box.x+box.dx-1,box.y+box.dy-1, box.z+box.dz-1) ;

  h_mri = MRIhistogramRegion(mri30, 0, NULL, &box) ;
  for (n = 0 ; n < h_mri->nbins-1 ; n++)
    if (h_mri->bins[n+1] > min_real_val)
      break ;
  HISTOclearBins(h_mri, h_mri, 0, n) ;
  if (Gdiag & DIAG_WRITE && DIAG_VERBOSE_ON)
    HISTOplot(h_mri, "mri.histo") ;
  mri_peak = HISTOfindLastPeak(h_mri, HISTO_WINDOW_SIZE,MIN_HISTO_PCT);
  mri_peak = h_mri->bins[mri_peak] ;
  printf("before smoothing, mri peak at %d\n", mri_peak) ;
  h_smooth = HISTOsmooth(h_mri, NULL, 2) ;
  if (Gdiag & DIAG_WRITE && DIAG_VERBOSE_ON)
    HISTOplot(h_smooth, "mri_smooth.histo") ;
  mri_peak = HISTOfindLastPeak(h_smooth, HISTO_WINDOW_SIZE,MIN_HISTO_PCT);
  mri_peak = h_mri->bins[mri_peak] ;
  printf("after smoothing, mri peak at %d\n", mri_peak) ;
  HISTOfree(&h_smooth) ;
  HISTOfree(&h_mri) ;
#endif

  min_val = 0 ;
  for (x = 0 ; x < width ; x++) {
    for (y = 0 ; y < height ; y++) {
      for (z = 0 ; z < depth ; z++) {
        if (x == Gx && y == Gy && z == Gz)
          DiagBreak() ;
        MRIsampleVolumeType(mri30, x, y, z, &val30, SAMPLE_NEAREST) ;
        MRIsampleVolumeType(mri5, x, y, z, &val5, SAMPLE_NEAREST) ;
        val = w30*val30 + w5*val5 ;
        MRIFvox(mri_dst, x, y, z) = val ;
        if (val < min_val)
          min_val = val ;
      }
    }
  }

  for (x = 0 ; x < width ; x++) {
    for (y = 0 ; y < height ; y++) {
      for (z = 0 ; z < depth ; z++) {
        if (x == Gx && y == Gy && z == Gz)
          DiagBreak() ;
        MRIFvox(mri_dst, x, y, z) += min_val ;
      }
    }
  }

  MRIfree(&mri30) ;
  MRIfree(&mri5) ;
  return(mri_dst) ;
}