Child pages
  • Lobal Segment from neuromorphometrica
Skip to end of metadata
Go to start of metadata

This is a trial getting lobal measure from the whole brain segmentation from neuromorphometrica.

Development Directory: 

Testing Directory: /Shared/johnsonhj/HDNI/20150202_MALF_LobalDefinition

FreeSurfer White matter parcellation in a BAW space: 


  • Under TissueClassify directory: 
    • FS_lobes.nii.gz
    • FS_wmparc.nii.gz

FreeSurfer running script (Hans):

  • /Shared/johnsonhj/HDNI/20150206_FS_Neuromorphometric/scripts/

Color Table:

Start from BRAINSTools' neuromorphometrical color table: 


Modification for lobal definition: 

  • Initial Neuromorphometric Labe: /Shared/johnsonhj/HDNI/20150202_MALF_LobalDefinition/MALFLabel_Lobes.txt
  • FS + Nuero: /Shared/johnsonhj/HDNI/20150202_MALF_LobalDefinition/ConceptProofForJeremy/FreeSurferColorLUT20150222_Extended_FSWM_BAWVer.txt
  • FS + Neuro for Lobes: /Shared/johnsonhj/HDNI/20150202_MALF_LobalDefinition/ConceptProofForJeremy/FreeSurferColorLUT20150222_Extended_FSWM_Lobes.txt

Lobal definition:

  • Major
    • Frontal
    • Parietal
    • Occipital
    • Temporal
  • Additional/Extra
    • Cerebellum
    • Brain Stem
    • Subcortical
    • Cingulate

Talking to Jeremy on Feb. 06 2015:

  • Wiki page has a nice hierarchical table of the lobes:
  • Free surfer white matter pacellation can be used to help our lobar definition with neuromorphometric.
  • Major four lobes are usefully regions of interest.
  • Extra regions are less important for now (e.g., subcortical, limbic system, cingulate). In addition, there is no general consensus on how each regions should belong to which lobes for cingulate, limbic and center of the brain.
  • Focus on a reasonable lobar definition in a short time period. Labels can be improved later in a long term with neuroanatomist.


FreeSurfer WM + Neuromorphometric GM Result on subject 633319246_20100409_30

A new Addition for Concept 


Enjoy Movie:

Result seems good in general BUT

  • I feel that the WM/GM edge is over-smoothed.
  • We cannot do further on this though. We should make it better for multi-modal HD atlases.


FreeSurfer WM trial

  1. Generate FreeSurfer Label for 20 neuromorphometric atlases in BAW space (Hans, done)
  2. Generate Lobar regions by combining neuromorphometric and FreeSurfer
    1. Identify lobar labels for white matter from FreeSurfer: FS_WM_label
    2. Mask out FS_WM_label with neuromorphometric white matter label (movie:
      1. Somehow combine those two labels so that FS_WM_label does not contaminate neuromorphometric's clean manual label. 
    3. Include FS_WM_label into our lobar definition
  3. Investigate results

Distance Map WM trial

Initial segment movie:

Neuromorphometrical Label To Lobar label (and distance map):

Working Directory: 



  1. Compute distance maps from four major lobes: Frontal, parietal, occipital, and temporal lobe
  2. Assign one of four major lobes based on above distance maps
  3. Mask out brain region, excluding blood and ventricles
  4. Over-write additional regions:
    1. Cingulate
    2. Limbic --> Not sure we have these yet.
    3. Cerebellum
    4. Subcortical
    5. Brain Stem


Distance Map Trial  ~ 20150204: Looks reasonable. We will try with FreeSurfer WM parcellation and see which one is better. 

  1. Read in label map between neuromorphometric and lobar (done)
  2. Relabel all the cortex into lobar label (done)
  3. Compute distance maps for each lobar label  (done)
  4. Assign the lobar label that has the least distance value. (done)
    1. movie on Neuromorphometrica
    2. movie on Track HD
  • See the results and compare

    Note on results

    Corpus Callosum should NOT be included.  

import SimpleITK as sitk
import csv
import collections 
lobarLabelDict = {"frontal_lobe":231,

read label, name, lobes, r,g,b,alpha
with open("../wholeBrain2LobarLabelMap.csv") as f:
    reader = csv.DictReader( f )
    Data = collections.namedtuple('Data', reader.fieldnames)
    LabelInfo = [Data(**row) for row in reader]
conversionLobarLabelMapDict = dict()
conversionExtraLobarLabelMapDict = dict()
for row in LabelInfo:
   if row.lobes != '':
        if row.lobes in lobarLabelDict:
            conversionLobarLabelMapDict[row.label] = lobarLabelDict[ row.lobes ]
        elif row.lobes in extraLobarLabelDict:
            conversionExtraLobarLabelMapDict[row.label] = extraLobarLabelDict[ row.lobes ]
            print "ERROR:Label "+row.lobes +" is not defined or valid label."
inputLabel=sitk.ReadImage("/Shared/johnsonhj/HDNI/Neuromorphometrics/20141116_Neuromorphometrics_base_Results/Neuromorphometrics/2012Subscription/1001/TissueClassify/neuro_lbls.nii.gz", sitk.sitkInt32)
inputLabel=sitk.ReadImage("/Shared/sinapse/CACHE/20141124_TrackOn_long_Results/HDNI_001/158312991/158312991_20131008_30/TissueClassify/neuro2012_20fusion_merge_seg.nii.gz", sitk.sitkInt32)
Relabel label map
for originalLabel in conversionLobarLabelMapDict.keys():
    labelImage = sitk.BinaryThreshold(inputLabel, float(originalLabel), float(originalLabel)  )
    labelImage = labelImage * conversionLobarLabelMapDict[originalLabel]
    labelImage = sitk.Cast(labelImage, lobarLabel.GetPixelID())
    lobarLabel = labelImage + lobarLabel
lobarLabel = sitk.Cast( lobarLabel, sitk.sitkInt32)
for originalLabel in conversionExtraLobarLabelMapDict.keys():
    labelImage = sitk.BinaryThreshold(inputLabel, float(originalLabel), float(originalLabel)  )
    labelImage = labelImage * conversionExtraLobarLabelMapDict[originalLabel]
    labelImage = sitk.Cast(labelImage, extLobarLabel.GetPixelID())
    extLobarLabel = labelImage + extLobarLabel
extLobarLabel = sitk.Cast( extLobarLabel, sitk.sitkInt32)
brain Mask without ventricles nor brain stem
NonLobarRegion = {'3rd_Ventricle':4,
for nonBrainRegion in NonBrainDict.keys():
    lobarMask = lobarMask - sitk.Threshold(inputLabel, NonBrainDict[nonBrainRegion],NonBrainDict[nonBrainRegion])
sitk.WriteImage( lobarMask>0, "158312991_20131008_30_lobarMask.nii.gz")

get the distance map
distMapImageDict = dict()
for lobe in lobarLabelDict.keys():
    oneLobeImage = sitk.BinaryThreshold(lobarLabel, 
                                        float(lobarLabelDict[lobe]) )
    distMapImageDict[lobe] = sitk.DanielssonDistanceMap( oneLobeImage, True )
    sitk.WriteImage(distMapImageDict[lobe] ,
                    "distMap_158312991_20131008_30_" + lobe + ".nii.gz")
get the minimum dist label
minimumDistLabel = sitk.Cast(lobarMask * 0, sitk.sitkInt32)
minimumDistValue = sitk.Cast(lobarMask * 0, sitk.sitkFloat32)
imageSize = lobarMask.GetSize()
for i in range(imageSize[0]):
    for j in range(imageSize[1]):
        for k in range(imageSize[2]):
            if lobarMask[i,j,k] == 0:
                minValue = 1000
                minLabel = 0
                for lobe in distMapImageDict.keys():
                    currentDist = distMapImageDict[lobe][i,j,k]
                    if currentDist < minValue:
                        minLabel = lobarLabelDict[ lobe ]
                        minValue = currentDist
Clean up labels for cerebellum, cinculate, subcortical, and insula
for i in range(imageSize[0]):
    for j in range(imageSize[1]):
        for k in range(imageSize[2]):
            if extLobarLabel[i,j,k] == 0:






  • No labels