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