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) ; }
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) ; }