Exemplo n.º 1
0
    def ngtdm_features(self):
        
        ngtdm_dict {}
        NGTDMFeatures = ngtdm.RadiomicsNGTDM(img,GT)
        NGTDMFeatures.enableAllFeatures()  # On the feature class level, all features are disabled by default.
        NGTDMFeatures.execute()
        for (key,val) in six.iteritems(NGTDMFeatures.featureValues):
            if self.all_: 
                self.feat_dict[self.seq + "_" + self.class_ + '_' + key] = val
            else: 
                ngtdm_dict[self.seq + "_" + self.class_ + "_" + key] = val

        df = pd.DataFrame(ngtdm_dict)
        if self.save_path:
            df.to_csv(os.path.join(self.save_path, 'ngtdm_features.csv'), index=False)
    
        return df
Exemplo n.º 2
0
    def ngtdm_features(self):

        ngtdm_dict = {}
        NGTDMFeatures = ngtdm.RadiomicsNGTDM(self.img, self.GT)
        NGTDMFeatures.enableAllFeatures(
        )  # On the feature class level, all features are disabled by default.
        NGTDMFeatures.execute()
        for (key, val) in six.iteritems(NGTDMFeatures.featureValues):
            self.feat_dict[key] = [val]
            ngtdm_dict[key] = [val]

        print(ngtdm_dict)
        df = pd.DataFrame(ngtdm_dict)
        if self.save_path:
            df.to_csv(os.path.join(self.save_path, 'ngtdm_features.csv'),
                      index=False)

        return df
Exemplo n.º 3
0
    def ngtdm_features(self):

        ngtdm_dict = {}
        NGTDMFeatures = ngtdm.RadiomicsNGTDM(self.img, self.GT)
        NGTDMFeatures.enableAllFeatures(
        )  # On the feature class level, all features are disabled by default.
        NGTDMFeatures.execute()
        for (key, val) in six.iteritems(NGTDMFeatures.featureValues):
            if self.all_:
                self.feat_dict[self.seq + "_" + self.class_ + '_' + key] = val
            else:
                ngtdm_dict[self.seq + "_" + self.class_ + "_" + key] = val

        if self.save_path and (not self.all_):
            self.write(ngtdm_dict,
                       os.path.join(self.save_path, 'ngtdm_features.pickle'))

        return ngtdm_dict
Exemplo n.º 4
0
def extract_features(folder_path, folder_id):
    # Load in preprocessed mri volumes
    scans = np.load(r"{}/{}_scans.npy".format(folder_path, folder_id))

    # Get t1ce and flair image from which to extract features
    t1ce_img = sitk.GetImageFromArray(scans[1])
    flair_img = sitk.GetImageFromArray(scans[3])

    # Convert scans from numpy to torch tensor and obtain segmentations with the model. Must Unsqueeze to be in format (B,C,H,W,D)
    scans = torch.unsqueeze(torch.from_numpy(scans), 0).to(device)
    _, mask = model(scans)
    mask = torch.squeeze(mask, 0)
    _, mask = mask.max(0)
    enhancing = (mask == 1).cpu().detach().numpy().astype('long')
    edema = (mask == 1).cpu().detach().numpy().astype('long')
    ncr_nenhancing = (mask == 3).cpu().detach().numpy().astype('long')

    regions = {
        'edema': {
            'mask': edema,
            'modality': flair_img
        },
        'enhancing': {
            'mask': enhancing,
            'modality': t1ce_img
        },
        'ncr_nenhancing': {
            'mask': ncr_nenhancing,
            'modality': t1ce_img
        }
    }

    # Convert the region arrays into SITK image objects so they can be inputted to the PyRadiomics featureextractor functions.
    all_features = {}
    printed = 0
    for (region_name, images) in regions.items():

        lbl_img = sitk.GetImageFromArray(images['mask'])
        if len(np.unique(images['mask'])) > 1:

            # Get First order features
            firstorderfeatures = firstorder.RadiomicsFirstOrder(
                images['modality'], lbl_img)
            firstorderfeatures.enableAllFeatures(
            )  # On the feature class level, all features are disabled by default
            firstorderfeatures.execute()
            for (key, val) in firstorderfeatures.featureValues.items():
                all_features[region_name + '_' + key] = val

            # Get Shape features
            shapefeatures = shape.RadiomicsShape(images['modality'], lbl_img)
            shapefeatures.enableAllFeatures()
            shapefeatures.execute()
            for (key, val) in shapefeatures.featureValues.items():
                all_features[region_name + '_' + key] = val

            # Get Gray Level Co-occurrence Matrix (GLCM) Features
            glcmfeatures = glcm.RadiomicsGLCM(images['modality'], lbl_img)
            glcmfeatures.enableAllFeatures()
            glcmfeatures.execute()
            for (key, val) in glcmfeatures.featureValues.items():
                all_features[region_name + '_' + key] = val

            # Get Gray Level Size Zone Matrix (GLSZM) Features
            glszmfeatures = glszm.RadiomicsGLSZM(images['modality'], lbl_img)
            glszmfeatures.enableAllFeatures()
            glszmfeatures.execute()
            for (key, val) in glszmfeatures.featureValues.items():
                all_features[region_name + '_' + key] = val

            # Get Gray Level Run Length Matrix (GLRLM) Features
            glrlmfeatures = glrlm.RadiomicsGLRLM(images['modality'], lbl_img)
            glrlmfeatures.enableAllFeatures()
            glrlmfeatures.execute()
            for (key, val) in glrlmfeatures.featureValues.items():
                all_features[region_name + '_' + key] = val

            # Get Neighbouring Gray Tone Difference Matrix (NGTDM) Features
            ngtdmfeatures = ngtdm.RadiomicsNGTDM(images['modality'], lbl_img)
            ngtdmfeatures.enableAllFeatures()
            ngtdmfeatures.execute()
            for (key, val) in ngtdmfeatures.featureValues.items():
                all_features[region_name + '_' + key] = val

            # Get Gray Level Dependence Matrix (GLDM) Features
            gldmfeatures = gldm.RadiomicsGLDM(images['modality'], lbl_img)
            gldmfeatures.enableAllFeatures()
            gldmfeatures.execute()
            for (key, val) in gldmfeatures.featureValues.items():
                all_features[region_name + '_' + key] = val
        else:
            if (not printed):
                print(folder_id)
                printed = 1
    return all_features
Exemplo n.º 5
0
def calculateRadiomicsFromJson(niiFile, jsonFile,wavelet,LoG,Square,SquareRoot,Logarithm,\
                Exponential,Gradient,LocalBinaryPattern2D,LocalBinaryPattern3D):
    sitkImageParent = sitk.ReadImage(niiFile)
    direction = sitkImageParent.GetDirection()
    origin = sitkImageParent.GetOrigin()
    spacing = sitkImageParent.GetSpacing()
    # processing json
    nodules = {}   
    parameterList = ["xBegin","yBegin","zBegin","DimInPixelX","DimInPixelY","DimInPixelZ",\
                     "sliceMask"]
    with open(jsonFile,mode='r') as f: 
        json_Data = json.load(f)
        nodule_List = json_Data.get("Nodules",None)
        if not nodule_List:
            print("Error!NO DATA IN json")
            return
        for subNodule,subVal in nodule_List.items():
            if str(subNodule) == 'count' or str(subNodule) == 'version' :
                continue
            # print("subNodule=",subNodule)
            # print("subVal=",subVal)
            label = subVal.get("Label",None)
            if not label:
                print("ERROR:Nodule No Label Info")
                return 
            nodules[label]={}
            nodules[label]['label'] = label
            nodules[label]['sliceMask'] = ''
            for arg in parameterList:
                if arg in ["DimInPixelX","DimInPixelY","DimInPixelZ"]:
                    nodules[label][arg] = int(subVal.get(arg,None))
                elif arg in ["xBegin","yBegin","zBegin"]:
                    if subVal.get("VerifiedNodule",None).get("mask",None):
                        nodules[label][arg] = float(subVal.get("VerifiedNodule",None).get("mask",None).get(arg,None))#subVal.get("VerifiedNodule",None).get("mask",None).get(arg,None))
                    else:
                        nodules[label][arg] = float(subVal.get("mask",None).get(arg,None))#subVal.get("VerifiedNodule",None).get("mask",None).get(arg,None))
                else:
                    if subVal.get("VerifiedNodule",None).get("mask",None):
                        subSliceMask = subVal.get("VerifiedNodule",None).get("mask",None).get("sliceMask",None)#.get("VerifiedNodule",None).get("mask",None).get("sliceMask",None)#['item']
                    else:
                        subSliceMask = subVal.get("mask",None).get("sliceMask",None)
                    subSliceMask.pop("count")
                    for key,val in subSliceMask.items():#current 
                        for i in val:
                            nodules[label][arg] += i
                    # nodules[label][arg] =subVal.get("VerifiedNodule",None).get("mask",None).get("sliceMask",None)['item']
    # print("nodules=",nodules)
    features = {}
    kwargs = {'binWidth': 64,
              'interpolator': sitk.sitkBSpline,
              'resampledPixelSpacing': None}
    for noduleLabel in nodules:
        if 'DimInPixelX' not in nodules[noduleLabel]:
            continue
        print("noduleLabel=",noduleLabel)
        bbox_dim = (nodules[noduleLabel]['DimInPixelX'], nodules[noduleLabel]['DimInPixelY'], \
                   nodules[noduleLabel]['DimInPixelZ'])
        bbox_ori = (nodules[noduleLabel]['xBegin'], nodules[noduleLabel]['yBegin'], \
                   nodules[noduleLabel]['zBegin'])

        sitkMask = sitk.Image(bbox_dim[0], bbox_dim[1], bbox_dim[2], sitk.sitkUInt8)
        sitkMask.SetSpacing(spacing)
        sitkMask.SetOrigin(bbox_ori)
        sitkMask.SetDirection(direction)

        for z in range(bbox_dim[2]):
            for y in range(bbox_dim[1]):
                for x in range(bbox_dim[0]):
                    idx = z * bbox_dim[1] * bbox_dim[0]  + y * bbox_dim[0] + x
                    v = int(nodules[noduleLabel]['sliceMask'][idx])
                    sitkMask.SetPixel(x, y, z, v)
        ori_matrix = (int(direction[0] * (bbox_ori[0] - origin[0]) / spacing[0]), \
                      int(direction[4] * (bbox_ori[1] - origin[1]) / spacing[1]), \
                      int(direction[8] * (bbox_ori[2] - origin[2]) / spacing[2]))

        sitkMask = resample_sitkImage(sitkMask, (spacing[0]/4, spacing[1]/4, spacing[2]/4))
        sitkImage = sitk.RegionOfInterest(sitkImageParent, sitkMask.GetSize(), ori_matrix)
        sitkImage.SetSpacing(spacing)
        sitkImage.SetOrigin(bbox_ori)
        sitkImage.SetDirection(direction)

        features[noduleLabel] = {}
        
        firstOrderFeatures = firstorder.RadiomicsFirstOrder(sitkImage, sitkMask, **kwargs)
        firstOrderFeatures.enableAllFeatures()
        firstOrderFeatures.calculateFeatures()
        firstOrderResult = features[noduleLabel].setdefault('firstorder', {})
        for (key, val) in six.iteritems(firstOrderFeatures.featureValues):
            firstOrderResult[key] = val

        shapeFeatures = shape.RadiomicsShape(sitkImage, sitkMask, **kwargs)
        shapeFeatures.enableAllFeatures()
        shapeFeatures.calculateFeatures()
        shapeResult = features[noduleLabel].setdefault('shape', {})
        for (key, val) in six.iteritems(shapeFeatures.featureValues):
            shapeResult[key] = val

        glcmFeatures = glcm.RadiomicsGLCM(sitkImage, sitkMask, **kwargs)
        glcmFeatures.enableAllFeatures()
        glcmFeatures.calculateFeatures()
        glcmResult = features[noduleLabel].setdefault('glcm', {})
        for (key, val) in six.iteritems(glcmFeatures.featureValues):
            glcmResult[key] = val

        glrlmFeatures = glrlm.RadiomicsGLRLM(sitkImage, sitkMask, **kwargs)
        glrlmFeatures.enableAllFeatures()
        glrlmFeatures.calculateFeatures()
        glrlmResult = features[noduleLabel].setdefault('glrlm', {})
        for (key, val) in six.iteritems(glrlmFeatures.featureValues):
            glrlmResult[key] = val

        glszmFeatures = glszm.RadiomicsGLSZM(sitkImage, sitkMask, **kwargs)
        glszmFeatures.enableAllFeatures()
        glszmFeatures.calculateFeatures()
        glszmResult = features[noduleLabel].setdefault('glszm', {})
        for (key, val) in six.iteritems(glszmFeatures.featureValues):
            glszmResult[key] = val
        #added new feature of gldm
        gldmFeatures = gldm.RadiomicsGLDM(sitkImage, sitkMask, **kwargs)
        gldmFeatures.enableAllFeatures()
        gldmFeatures.calculateFeatures()
        gldmFeatures = features[noduleLabel].setdefault('gldm', {})
        for (key, val) in six.iteritems(glszmFeatures.featureValues):
            gldmFeatures[key] = val
        #added new feature of ngtdm
        ngtdmFeatures = ngtdm.RadiomicsNGTDM(sitkImage, sitkMask, **kwargs)
        ngtdmFeatures.enableAllFeatures()
        ngtdmFeatures.calculateFeatures()
        ngtdmFeatures = features[noduleLabel].setdefault('ngtdm', {})
        for (key, val) in six.iteritems(glszmFeatures.featureValues):
            ngtdmFeatures[key] = val

        print("features=",features)

        featuresList = ["FirstOrder","Shape","GLCM","GLRLM","GLSZM","NGTDM","GLDM"]
        if LoG:
            sigmaValues = numpy.arange(5., 0., -.5)[::1]
            for logImage, imageTypeName, inputKwargs in imageoperations.getLoGImage(sitkImage, sitkMask,sigma=sigmaValues):
                for filterName  in featuresList: 
                    exec("LoG"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(logImage, sitkMask, **inputKwargs)")
                for feature in featuresList:
                    exec("LoG"+feature+"Features.enableAllFeatures()")
                    exec("LoG"+feature+"Features.calculateFeatures()")
                LoGFirstOrderResult = features[noduleLabel].setdefault('LoGFirstOrder', {})
                LoGShapeResult = features[noduleLabel].setdefault('LoGShape', {})
                LoGGLCMResult = features[noduleLabel].setdefault('LoGGlcm', {})
                LoGGLRLMResult = features[noduleLabel].setdefault('LoGGlrlm', {})
                LoGGLSZMResult = features[noduleLabel].setdefault('LoGGlszm', {})
                LoGGLDMResult = features[noduleLabel].setdefault('LoGGldm', {})
                LoGNGTDMResult = features[noduleLabel].setdefault('LoGNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("LoG" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                       exec("LoG"+filterName+"Result[key]=val") 
        
        if wavelet:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getWaveletImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("wavelet"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("wavelet"+filterName+"Features.enableAllFeatures()")
                    exec("wavelet"+filterName+"Features.calculateFeatures()")
                waveletFirstOrderResult = features[noduleLabel].setdefault('waveletFirstOrder', {})
                waveletShapeResult = features[noduleLabel].setdefault('waveletShape', {})
                waveletGLCMResult = features[noduleLabel].setdefault('waveletGlcm', {})
                waveletGLRLMResult = features[noduleLabel].setdefault('waveletGlrlm', {})
                waveletGLSZMResult = features[noduleLabel].setdefault('waveletGlszm', {})
                waveletGLDMResult = features[noduleLabel].setdefault('waveletGldm', {})
                waveletNGTDMResult = features[noduleLabel].setdefault('waveletNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("wavelet" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                       exec("wavelet"+filterName+"Result[key]=val") 
        if Square:
            # calculateSubFilterValues(imageType =="Square",features,noduleLabel,sitkImage,sitkMask)
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getSquareImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("square"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("square"+filterName+"Features.enableAllFeatures()")
                    exec("square"+filterName+"Features.calculateFeatures()")
                squareFirstOrderResult = features[noduleLabel].setdefault('squareFirstOrder', {})
                squareShapeResult = features[noduleLabel].setdefault('squareShape', {})
                squareGLCMResult = features[noduleLabel].setdefault('squareGlcm', {})
                squareGLRLMResult = features[noduleLabel].setdefault('squareGlrlm', {})
                squareGLSZMResult = features[noduleLabel].setdefault('squareGlszm', {})
                squareGLDMResult = features[noduleLabel].setdefault('squareGldm', {})
                squareNGTDMResult = features[noduleLabel].setdefault('squareNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("square" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("square"+filterName+"Result[key]=val") 
        if SquareRoot:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getSquareRootImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("squareRoot"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("squareRoot"+filterName+"Features.enableAllFeatures()")
                    exec("squareRoot"+filterName+"Features.calculateFeatures()")
                squareRootFirstOrderResult = features[noduleLabel].setdefault('squareRootFirstOrder', {})
                squareRootShapeResult = features[noduleLabel].setdefault('squareRootShape', {})
                squareRootGLCMResult = features[noduleLabel].setdefault('squareRootGlcm', {})
                squareRootGLRLMResult = features[noduleLabel].setdefault('squareRootGlrlm', {})
                squareRootGLSZMResult = features[noduleLabel].setdefault('squareRootGlszm', {})
                squareRootGLDMResult = features[noduleLabel].setdefault('squareRootGldm', {})
                squareRootNGTDMResult = features[noduleLabel].setdefault('squareRootNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("squareRoot" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("squareRoot"+filterName+"Result[key]=val") 
        if Logarithm:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getLogarithmImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("logarithm"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("logarithm"+filterName+"Features.enableAllFeatures()")
                    exec("logarithm"+filterName+"Features.calculateFeatures()")
                logarithmFirstOrderResult = features[noduleLabel].setdefault('logarithmFirstOrder', {})
                logarithmShapeResult = features[noduleLabel].setdefault('logarithmShape', {})
                logarithmGLCMResult = features[noduleLabel].setdefault('logarithmGlcm', {})
                logarithmGLRLMResult = features[noduleLabel].setdefault('logarithmGlrlm', {})
                logarithmGLSZMResult = features[noduleLabel].setdefault('logarithmGlszm', {})
                logarithmGLDMResult = features[noduleLabel].setdefault('logarithmGldm', {})
                logarithmNGTDMResult = features[noduleLabel].setdefault('logarithmNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("logarithm" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("logarithm"+filterName+"Result[key]=val")
    
        if Exponential:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getExponentialImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("Exponential"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("Exponential"+filterName+"Features.enableAllFeatures()")
                    exec("Exponential"+filterName+"Features.calculateFeatures()")
                ExponentialFirstOrderResult = features[noduleLabel].setdefault('ExponentialFirstOrder', {})
                ExponentialShapeResult = features[noduleLabel].setdefault('ExponentialShape', {})
                ExponentialGLCMResult = features[noduleLabel].setdefault('ExponentialGlcm', {})
                ExponentialGLRLMResult = features[noduleLabel].setdefault('ExponentialGlrlm', {})
                ExponentialGLSZMResult = features[noduleLabel].setdefault('ExponentialGlszm', {})
                ExponentialGLDMResult = features[noduleLabel].setdefault('ExponentialGldm', {})
                ExponentialNGTDMResult = features[noduleLabel].setdefault('ExponentialNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("Exponential" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("Exponential"+filterName+"Result[key]=val") 
        if Gradient:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getGradientImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("Gradient"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("Gradient"+filterName+"Features.enableAllFeatures()")
                    exec("Gradient"+filterName+"Features.calculateFeatures()")
                GradientFirstOrderResult = features[noduleLabel].setdefault('GradientFirstOrder', {})
                GradientShapeResult = features[noduleLabel].setdefault('GradientShape', {})
                GradientGLCMResult = features[noduleLabel].setdefault('GradientGlcm', {})
                GradientGLRLMResult = features[noduleLabel].setdefault('GradientGlrlm', {})
                GradientGLSZMResult = features[noduleLabel].setdefault('GradientGlszm', {})
                GradientGLDMResult = features[noduleLabel].setdefault('GradientGldm', {})
                GradientNGTDMResult = features[noduleLabel].setdefault('GradientNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("Gradient" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("Gradient"+filterName+"Result[key]=val") 
                        
        #LocalBinaryPattern2D,LocalBinaryPattern3D
        if LocalBinaryPattern2D:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getLBP2DImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("LBP2D"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("LBP2D"+filterName+"Features.enableAllFeatures()")
                    exec("LBP2D"+filterName+"Features.calculateFeatures()")
                LBP2DFirstOrderResult = features[noduleLabel].setdefault('LBP2DFirstOrder', {})
                LBP2DShapeResult = features[noduleLabel].setdefault('LBP2DShape', {})
                LBP2DGLCMResult = features[noduleLabel].setdefault('LBP2DGlcm', {})
                LBP2DGLRLMResult = features[noduleLabel].setdefault('LBP2DGlrlm', {})
                LBP2DGLSZMResult = features[noduleLabel].setdefault('LBP2DGlszm', {})
                LBP2DGLDMResult = features[noduleLabel].setdefault('LBP2DGldm', {})
                LBP2DNGTDMResult = features[noduleLabel].setdefault('LBP2DNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("LBP2D" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("LBP2D"+filterName+"Result[key]=val") 
        
        if LocalBinaryPattern3D:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getLBP3DImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("LBP3D"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("LBP3D"+filterName+"Features.enableAllFeatures()")
                    exec("LBP3D"+filterName+"Features.calculateFeatures()")
                LBP3DFirstOrderResult = features[noduleLabel].setdefault('LBP3DFirstOrder', {})
                LBP3DShapeResult = features[noduleLabel].setdefault('LBP3DShape', {})
                LBP3DGLCMResult = features[noduleLabel].setdefault('LBP3DGlcm', {})
                LBP3DGLRLMResult = features[noduleLabel].setdefault('LBP3DGlrlm', {})
                LBP3DGLSZMResult = features[noduleLabel].setdefault('LBP3DGlszm', {})
                LBP3DGLDMResult = features[noduleLabel].setdefault('LBP3DGldm', {})
                LBP3DNGTDMResult = features[noduleLabel].setdefault('LBP3DNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("LBP3D" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("LBP3D"+filterName+"Result[key]=val")
    return features
Exemplo n.º 6
0
def calculateRadiomicsFromJson(niiFile, jsonFile,wavelet,LoG,Square,SquareRoot,Logarithm,\
                Exponential,Gradient,LocalBinaryPattern2D,LocalBinaryPattern3D):
    # moduleConfig = get_current_config()
    # processing nii
    sitkImageParent = sitk.ReadImage(niiFile)
    direction = sitkImageParent.GetDirection()
    origin = sitkImageParent.GetOrigin()
    spacing = sitkImageParent.GetSpacing()
    # processing json
    f = open(jsonFile)
    p = ijson.parse(f)
    # print("p={}".format(p))
    nodules = {}
    label = ''
    for prefix, _, value in p:
        # print()
        if re.match('Nodules.item\d+.Label', prefix) or prefix == 'Nodules.item.Label':
            label = value
            nodules[label] = {}
            nodules[label]['label'] = value
            nodules[label]['sliceMask'] = ''
        if re.match('Nodules.item\d+.mask.xBegin', prefix) or prefix == 'Nodules.item.mask.xBegin':
            nodules[label]['xBegin'] = float(value)
        if re.match('Nodules.item\d+.mask.yBegin', prefix) or prefix == 'Nodules.item.mask.yBegin':
            nodules[label]['yBegin'] = float(value)
        if re.match('Nodules.item\d+.mask.zBegin', prefix) or prefix == 'Nodules.item.mask.zBegin':
            nodules[label]['zBegin'] = float(value)
        if re.match('Nodules.item\d+.DimInPixelX', prefix) or prefix == 'Nodules.item.DimInPixelX':
            nodules[label]['DimInPixelX'] =int(float(value))
        if re.match('Nodules.item\d+.DimInPixelY', prefix) or prefix == 'Nodules.item.DimInPixelY':
            nodules[label]['DimInPixelY'] = int(float(value))
        if re.match('Nodules.item\d+.DimInPixelZ', prefix) or prefix == 'Nodules.item.DimInPixelZ':
            nodules[label]['DimInPixelZ'] = int(float(value))
        if re.match('Nodules.item\d+.mask.sliceMask.item\d+', prefix) or prefix == 'Nodules.item.mask.sliceMask.item':
            nodules[label]['sliceMask'] += value
    # working on radiomics calculation
    features = {}
    kwargs = {'binWidth': 64,
              'interpolator': sitk.sitkBSpline,
              'resampledPixelSpacing': None}
    # print("nodules=",nodules)
    for noduleLabel in nodules:
        if 'DimInPixelX' not in nodules[noduleLabel]:
            continue
        bbox_dim = (nodules[noduleLabel]['DimInPixelX'], nodules[noduleLabel]['DimInPixelY'], \
                   nodules[noduleLabel]['DimInPixelZ'])
        bbox_ori = (nodules[noduleLabel]['xBegin'], nodules[noduleLabel]['yBegin'], \
                   nodules[noduleLabel]['zBegin'])
        print("bbox_dim={}".format(bbox_dim))
        sitkMask = sitk.Image(bbox_dim[0], bbox_dim[1], bbox_dim[2], sitk.sitkUInt8)
        sitkMask.SetSpacing(spacing)
        sitkMask.SetOrigin(bbox_ori)
        sitkMask.SetDirection(direction)

        for z in range(bbox_dim[2]):#9
            for y in range(bbox_dim[1]):  #16
                for x in range(bbox_dim[0]): #17
                    # print("x,y,z={}{}{}".format(x,y,z))
                    # print("{},{},{}".format(x,y,z))
                    idx = z * bbox_dim[1] * bbox_dim[0]  + y * bbox_dim[0] + x
                    # print("idx={}".format(idx))
                    v = int(nodules[noduleLabel]['sliceMask'][idx])
                    sitkMask.SetPixel(x, y, z, v)
        ori_matrix = (int(direction[0] * (bbox_ori[0] - origin[0]) / spacing[0]), \
                      int(direction[4] * (bbox_ori[1] - origin[1]) / spacing[1]), \
                      int(direction[8] * (bbox_ori[2] - origin[2]) / spacing[2]))

        # sitkMask = resample_sitkImage(sitkMask, (spacing[0]/2, spacing[1]/2, spacing[2]/2))
        sitkImage = sitk.RegionOfInterest(sitkImageParent, sitkMask.GetSize(), ori_matrix)
        sitkImage.SetSpacing(spacing)
        sitkImage.SetOrigin(bbox_ori)
        sitkImage.SetDirection(direction)

        features[noduleLabel] = {}

        firstOrderFeatures = firstorder.RadiomicsFirstOrder(sitkImage, sitkMask, **kwargs)
        firstOrderFeatures.enableAllFeatures()
        firstOrderFeatures.calculateFeatures()
        firstOrderResult = features[noduleLabel].setdefault('firstorder', {})
        for (key, val) in six.iteritems(firstOrderFeatures.featureValues):
            firstOrderResult[key] = val

        shapeFeatures = shape.RadiomicsShape(sitkImage, sitkMask, **kwargs)
        shapeFeatures.enableAllFeatures()
        shapeFeatures.calculateFeatures()
        shapeResult = features[noduleLabel].setdefault('shape', {})
        for (key, val) in six.iteritems(shapeFeatures.featureValues):
            shapeResult[key] = val

        glcmFeatures = glcm.RadiomicsGLCM(sitkImage, sitkMask, **kwargs)
        glcmFeatures.enableAllFeatures()
        glcmFeatures.calculateFeatures()
        glcmResult = features[noduleLabel].setdefault('glcm', {})
        for (key, val) in six.iteritems(glcmFeatures.featureValues):
            glcmResult[key] = val

        glrlmFeatures = glrlm.RadiomicsGLRLM(sitkImage, sitkMask, **kwargs)
        glrlmFeatures.enableAllFeatures()
        glrlmFeatures.calculateFeatures()
        glrlmResult = features[noduleLabel].setdefault('glrlm', {})
        for (key, val) in six.iteritems(glrlmFeatures.featureValues):
            glrlmResult[key] = val

        glszmFeatures = glszm.RadiomicsGLSZM(sitkImage, sitkMask, **kwargs)
        glszmFeatures.enableAllFeatures()
        glszmFeatures.calculateFeatures()
        glszmResult = features[noduleLabel].setdefault('glszm', {})
        for (key, val) in six.iteritems(glszmFeatures.featureValues):
            glszmResult[key] = val
        #added new feature of gldm
        gldmFeatures = gldm.RadiomicsGLDM(sitkImage, sitkMask, **kwargs)
        gldmFeatures.enableAllFeatures()
        gldmFeatures.calculateFeatures()
        gldmFeatures = features[noduleLabel].setdefault('gldm', {})
        for (key, val) in six.iteritems(glszmFeatures.featureValues):
            gldmFeatures[key] = val
        #added new feature of ngtdm
        ngtdmFeatures = ngtdm.RadiomicsNGTDM(sitkImage, sitkMask, **kwargs)
        ngtdmFeatures.enableAllFeatures()
        ngtdmFeatures.calculateFeatures()
        ngtdmFeatures = features[noduleLabel].setdefault('ngtdm', {})
        for (key, val) in six.iteritems(glszmFeatures.featureValues):
            ngtdmFeatures[key] = val

        featuresList = ["FirstOrder","Shape","GLCM","GLRLM","GLSZM","NGTDM","GLDM"]
        if LoG:
            sigmaValues = numpy.arange(5., 0., -.5)[::1]
            for logImage, imageTypeName, inputKwargs in imageoperations.getLoGImage(sitkImage, sitkMask,sigma=sigmaValues):
                for filterName  in featuresList: 
                    exec("LoG"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(logImage, sitkMask, **inputKwargs)")
                for feature in featuresList:
                    exec("LoG"+feature+"Features.enableAllFeatures()")
                    exec("LoG"+feature+"Features.calculateFeatures()")
                LoGFirstOrderResult = features[noduleLabel].setdefault('logFirstOrder', {})
                LoGShapeResult = features[noduleLabel].setdefault('logShape', {})
                LoGGLCMResult = features[noduleLabel].setdefault('logGlcm', {})
                LoGGLRLMResult = features[noduleLabel].setdefault('logGlrlm', {})
                LoGGLSZMResult = features[noduleLabel].setdefault('logGlszm', {})
                LoGGLDMResult = features[noduleLabel].setdefault('logGldm', {})
                LoGNGTDMResult = features[noduleLabel].setdefault('logNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("LoG" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                       exec("LoG"+filterName+"Result[key]=val") 
        
        if wavelet:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getWaveletImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("wavelet"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("wavelet"+filterName+"Features.enableAllFeatures()")
                    exec("wavelet"+filterName+"Features.calculateFeatures()")
                waveletFirstOrderResult = features[noduleLabel].setdefault('waveletFirstOrder', {})
                waveletShapeResult = features[noduleLabel].setdefault('waveletShape', {})
                waveletGLCMResult = features[noduleLabel].setdefault('waveletGlcm', {})
                waveletGLRLMResult = features[noduleLabel].setdefault('waveletGlrlm', {})
                waveletGLSZMResult = features[noduleLabel].setdefault('waveletGlszm', {})
                waveletGLDMResult = features[noduleLabel].setdefault('waveletGldm', {})
                waveletNGTDMResult = features[noduleLabel].setdefault('waveletNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("wavelet" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                       exec("wavelet"+filterName+"Result[key]=val") 
        if Square:
            # calculateSubFilterValues(imageType =="Square",features,noduleLabel,sitkImage,sitkMask)
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getSquareImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("square"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("square"+filterName+"Features.enableAllFeatures()")
                    exec("square"+filterName+"Features.calculateFeatures()")
                squareFirstOrderResult = features[noduleLabel].setdefault('squareFirstOrder', {})
                squareShapeResult = features[noduleLabel].setdefault('squareShape', {})
                squareGLCMResult = features[noduleLabel].setdefault('squareGlcm', {})
                squareGLRLMResult = features[noduleLabel].setdefault('squareGlrlm', {})
                squareGLSZMResult = features[noduleLabel].setdefault('squareGlszm', {})
                squareGLDMResult = features[noduleLabel].setdefault('squareGldm', {})
                squareNGTDMResult = features[noduleLabel].setdefault('squareNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("square" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("square"+filterName+"Result[key]=val") 
        if SquareRoot:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getSquareRootImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("squareRoot"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("squareRoot"+filterName+"Features.enableAllFeatures()")
                    exec("squareRoot"+filterName+"Features.calculateFeatures()")
                squareRootFirstOrderResult = features[noduleLabel].setdefault('squareRootFirstOrder', {})
                squareRootShapeResult = features[noduleLabel].setdefault('squareRootShape', {})
                squareRootGLCMResult = features[noduleLabel].setdefault('squareRootGlcm', {})
                squareRootGLRLMResult = features[noduleLabel].setdefault('squareRootGlrlm', {})
                squareRootGLSZMResult = features[noduleLabel].setdefault('squareRootGlszm', {})
                squareRootGLDMResult = features[noduleLabel].setdefault('squareRootGldm', {})
                squareRootNGTDMResult = features[noduleLabel].setdefault('squareRootNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("squareRoot" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("squareRoot"+filterName+"Result[key]=val") 
        if Logarithm:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getLogarithmImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("logarithm"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("logarithm"+filterName+"Features.enableAllFeatures()")
                    exec("logarithm"+filterName+"Features.calculateFeatures()")
                logarithmFirstOrderResult = features[noduleLabel].setdefault('logarithmFirstOrder', {})
                logarithmShapeResult = features[noduleLabel].setdefault('logarithmShape', {})
                logarithmGLCMResult = features[noduleLabel].setdefault('logarithmGlcm', {})
                logarithmGLRLMResult = features[noduleLabel].setdefault('logarithmGlrlm', {})
                logarithmGLSZMResult = features[noduleLabel].setdefault('logarithmGlszm', {})
                logarithmGLDMResult = features[noduleLabel].setdefault('logarithmGldm', {})
                logarithmNGTDMResult = features[noduleLabel].setdefault('logarithmNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("logarithm" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("logarithm"+filterName+"Result[key]=val")
    
        if Exponential:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getExponentialImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("Exponential"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("Exponential"+filterName+"Features.enableAllFeatures()")
                    exec("Exponential"+filterName+"Features.calculateFeatures()")
                ExponentialFirstOrderResult = features[noduleLabel].setdefault('ExponentialFirstOrder', {})
                ExponentialShapeResult = features[noduleLabel].setdefault('ExponentialShape', {})
                ExponentialGLCMResult = features[noduleLabel].setdefault('ExponentialGlcm', {})
                ExponentialGLRLMResult = features[noduleLabel].setdefault('ExponentialGlrlm', {})
                ExponentialGLSZMResult = features[noduleLabel].setdefault('ExponentialGlszm', {})
                ExponentialGLDMResult = features[noduleLabel].setdefault('ExponentialGldm', {})
                ExponentialNGTDMResult = features[noduleLabel].setdefault('ExponentialNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("Exponential" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("Exponential"+filterName+"Result[key]=val") 
        if Gradient:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getGradientImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("Gradient"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("Gradient"+filterName+"Features.enableAllFeatures()")
                    exec("Gradient"+filterName+"Features.calculateFeatures()")
                GradientFirstOrderResult = features[noduleLabel].setdefault('GradientFirstOrder', {})
                GradientShapeResult = features[noduleLabel].setdefault('GradientShape', {})
                GradientGLCMResult = features[noduleLabel].setdefault('GradientGlcm', {})
                GradientGLRLMResult = features[noduleLabel].setdefault('GradientGlrlm', {})
                GradientGLSZMResult = features[noduleLabel].setdefault('GradientGlszm', {})
                GradientGLDMResult = features[noduleLabel].setdefault('GradientGldm', {})
                GradientNGTDMResult = features[noduleLabel].setdefault('GradientNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("Gradient" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("Gradient"+filterName+"Result[key]=val") 
                        
        #LocalBinaryPattern2D,LocalBinaryPattern3D
        if LocalBinaryPattern2D:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getLBP2DImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("LBP2D"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("LBP2D"+filterName+"Features.enableAllFeatures()")
                    exec("LBP2D"+filterName+"Features.calculateFeatures()")
                LBP2DFirstOrderResult = features[noduleLabel].setdefault('LBP2DFirstOrder', {})
                LBP2DShapeResult = features[noduleLabel].setdefault('LBP2DShape', {})
                LBP2DGLCMResult = features[noduleLabel].setdefault('LBP2DGlcm', {})
                LBP2DGLRLMResult = features[noduleLabel].setdefault('LBP2DGlrlm', {})
                LBP2DGLSZMResult = features[noduleLabel].setdefault('LBP2DGlszm', {})
                LBP2DGLDMResult = features[noduleLabel].setdefault('LBP2DGldm', {})
                LBP2DNGTDMResult = features[noduleLabel].setdefault('LBP2DNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("LBP2D" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("LBP2D"+filterName+"Result[key]=val") 
        
        if LocalBinaryPattern3D:
            for decompositionImage, decompositionName, inputKwargs in imageoperations.getLBP3DImage(sitkImage,sitkMask):
                for filterName  in featuresList: 
                    exec("LBP3D"+filterName+"Features = "+filterName.lower()+".Radiomics"+filterName+"(decompositionImage, sitkMask, **inputKwargs)")
                    exec("LBP3D"+filterName+"Features.enableAllFeatures()")
                    exec("LBP3D"+filterName+"Features.calculateFeatures()")
                LBP3DFirstOrderResult = features[noduleLabel].setdefault('LBP3DFirstOrder', {})
                LBP3DShapeResult = features[noduleLabel].setdefault('LBP3DShape', {})
                LBP3DGLCMResult = features[noduleLabel].setdefault('LBP3DGlcm', {})
                LBP3DGLRLMResult = features[noduleLabel].setdefault('LBP3DGlrlm', {})
                LBP3DGLSZMResult = features[noduleLabel].setdefault('LBP3DGlszm', {})
                LBP3DGLDMResult = features[noduleLabel].setdefault('LBP3DGldm', {})
                LBP3DNGTDMResult = features[noduleLabel].setdefault('LBP3DNGTDM', {})
                for filterName in featuresList:
                    subFeatureValue =eval("LBP3D" + filterName + "Features.featureValues")
                    for (key, val) in six.iteritems(subFeatureValue):
                        exec("LBP3D"+filterName+"Result[key]=val") 
    return features
Exemplo n.º 7
0
mask_path = '../mask'
Tumor = os.listdir(tumor_path)
Mask = os.listdir(mask_path)
file = Workbook(encoding='ascii')
table = file.add_sheet('data')
for idx in xrange(len(Tumor)):
    image = sitk.ReadImage(os.path.join(tumor_path, Tumor[idx]))
    mask = sitk.ReadImage(os.path.join(mask_path, Mask[idx]))

    shapeFeatures = shape.RadiomicsShape(image, mask)
    firstorderFeatures = firstorder.RadiomicsFirstOrder(image, mask)
    glcmFeatures = glcm.RadiomicsGLCM(image, mask)
    gldmFeatures = gldm.RadiomicsGLDM(image, mask)
    glrlmFeatures = glrlm.RadiomicsGLRLM(image, mask)
    glszmFeatures = glszm.RadiomicsGLSZM(image, mask)
    ngtdmFeatures = ngtdm.RadiomicsNGTDM(image, mask)

    shapeFeatures.enableAllFeatures()
    glcmFeatures.enableAllFeatures()
    firstorderFeatures.enableAllFeatures()
    gldmFeatures.enableAllFeatures()
    glrlmFeatures.enableAllFeatures()
    glszmFeatures.enableAllFeatures()
    ngtdmFeatures.enableAllFeatures()

    shapeFeatures.execute()
    glszmFeatures.execute()
    glcmFeatures.execute()
    firstorderFeatures.execute()
    gldmFeatures.execute()
    glrlmFeatures.execute()
Exemplo n.º 8
0
def extractor(image_array, mask_array, applyLog = False,applyWavelet = False ):
    feature_vectors = {}
    cache_file = os.path.join(DATA_CACHE_PATH_OUT,'cache_%s.nrrd'%random.random())
    nrrd.write(cache_file, image_array)
    image = sitk.ReadImage(cache_file)
    nrrd.write(cache_file, mask_array)
    mask = sitk.ReadImage(cache_file)


    settings = {'binWidth': 25,
            'interpolator': None, #sitk.sitkBSpline,
            'resampledPixelSpacing': None}
    # interpolator = settings.get('interpolator')
    # resampledPixelSpacing = settings.get('resampledPixelSpacing')
    # if interpolator is not None and resampledPixelSpacing is not None:
    #     image, mask = imageoperations.resampleImage(image, mask, **settings)
    # bb, correctedMask = imageoperations.checkMask(image, mask)
    # if correctedMask is not None:
    #   mask = correctedMask
    # image, mask = imageoperations.cropToTumorMask(image, mask, bb)
    
    features = firstorder.RadiomicsFirstOrder(image, mask, **settings)
    # features.enableFeatureByName('Mean', True)
    features.enableAllFeatures()

    # print('Will calculate the following first order features: ')
    # for f in features.enabledFeatures.keys():
    #   print('  ', f)
    #   print(getattr(features, 'get%sFeatureValue' % f).__doc__)

    # print('Calculating first order features...')
    results = features.execute()
    # print('done')

    # print('Calculated first order features: ')
    for (key, val) in six.iteritems(results):
        firstOrderFeatureName = '%s_%s' % ('firstOrder', key)
        if firstOrderFeatureName not in feature_vectors:
            feature_vectors[firstOrderFeatureName] = val
        else:
            print('Error: firstOrder key existing! %s'%firstOrderFeatureName)
            # break
        # print('  ', key, ':', val)
    print('ADDED %s first Order Features'%len(results))
    #
    # Show Shape features
    #

    features = shape.RadiomicsShape(image, mask, **settings)
    features.enableAllFeatures()

    # print('Will calculate the following Shape features: ')
    # for f in features.enabledFeatures.keys():
    #   print('  ', f)
    #   print(getattr(features, 'get%sFeatureValue' % f).__doc__)

    # print('Calculating Shape features...')
    results = features.execute()
    # print('done')

    # print('Calculated Shape features: ')
    for (key, val) in six.iteritems(results):
        ShapeFeatureName = '%s_%s' % ('Shape', key)
        if ShapeFeatureName not in feature_vectors:
            feature_vectors[ShapeFeatureName] = val
        else:
            print('Error: shape key existing! %s'%ShapeFeatureName)
            # break
        # print('  ', key, ':', val)
    print('ADDED %s shape Features'%len(results))
    #
    # Show GLCM features: Gray Level Co-occurrence Matrix (GLCM) Features
    #
    features = glcm.RadiomicsGLCM(image, mask, **settings)
    features.enableAllFeatures()

    # print('Will calculate the following GLCM features: ')
    # for f in features.enabledFeatures.keys():
    #   print('  ', f)
    #   print(getattr(features, 'get%sFeatureValue' % f).__doc__)

    # print('Calculating GLCM features...')
    results = features.execute()
    # print('done')

    # print('Calculated GLCM features: ')
    for (key, val) in six.iteritems(results):
        GLCMFeatureName = '%s_%s' % ('GLCM', key)
        if GLCMFeatureName not in feature_vectors:
            feature_vectors[GLCMFeatureName] = val
        else:
            print('Error: GLCM key existing! %s'%GLCMFeatureName)
            # break
        # print('  ', key, ':', val)


    print('ADDED %s GLCM Features'%len(results))
    #
    # Show GLSZM features; Gray Level Size Zone Matrix (GLSZM) Features
    #
    features = glszm.RadiomicsGLSZM(image, mask, **settings)
    features.enableAllFeatures()

    # print('Will calculate the following GLSZM features: ')
    # for f in features.enabledFeatures.keys():
    #   print('  ', f)
    #   print(getattr(features, 'get%sFeatureValue' % f).__doc__)

    # print('Calculating GLSZM features...')
    results = features.execute()

    # print('Calculated GLSZM features: ')
    for (key, val) in six.iteritems(results):
        GLSZMFeatureName = '%s_%s' % ('GLSZM', key)
        if GLSZMFeatureName not in feature_vectors:
            feature_vectors[GLSZMFeatureName] = val
        else:
            print('Error: GLSZM key existing! %s'%GLSZMFeatureName)
            # break
        # print('  ', key, ':', val)
    print('ADDED %s GLSZ Features'%len(results))

    #
    # Show GLRLM features; Gray Level Run Length Matrix (GLRLM) Features
    #
    features = glrlm.RadiomicsGLRLM(image, mask, **settings)
    features.enableAllFeatures()

    # print('Will calculate the following GLRLM features: ')
    # for f in features.enabledFeatures.keys():
    #   print('  ', f)
    #   print(getattr(features, 'get%sFeatureValue' % f).__doc__)

    # print('Calculating GLRLM features...')
    results = features.execute()
    # print('done')

    # print('Calculated GLRLM features: ')
    for (key, val) in six.iteritems(results):
        GLRLMFeatureName = '%s_%s' % ('GLRLM', key)
        if GLRLMFeatureName not in feature_vectors:
            feature_vectors[GLRLMFeatureName] = val
        else:
            print('Error: GLRLM key existing! %s'%GLRLMFeatureName)
            # break
        # print('  ', key, ':', val)
    print('ADDED %s GLRM Features'%len(results))
    #
    # Show NGTDM features; Neighbouring Gray Tone Difference Matrix (NGTDM) Features
    #
    features = ngtdm.RadiomicsNGTDM(image, mask, **settings)
    features.enableAllFeatures()

    # print('Will calculate the following NGTDM features: ')
    # for f in features.enabledFeatures.keys():
    #   print('  ', f)
    #   print(getattr(features, 'get%sFeatureValue' % f).__doc__)

    # print('Calculating NGTDM features...')
    results = features.execute()
    # print('done')

    # print('Calculated NGTDM features: ')
    for (key, val) in six.iteritems(results):
        NGTDMFeatureName = '%s_%s' % ('NGTDM', key)
        if NGTDMFeatureName not in feature_vectors:
            feature_vectors[NGTDMFeatureName] = val
        else:
            print('Error: NGTDM key existing! %s'%NGTDMFeatureName)
            # break
        # print('  ', key, ':', val)
    print('ADDED %s NGTDM Features'%len(results))
    #
    # Show GLDM features; Gray Level Dependence Matrix (GLDM) Features
    #
    features = gldm.RadiomicsGLDM(image, mask, **settings)
    features.enableAllFeatures()

    # print('Will calculate the following GLDM features: ')
    # for f in features.enabledFeatures.keys():
    #   print('  ', f)
    #   print(getattr(features, 'get%sFeatureValue' % f).__doc__)

    # print('Calculating GLDM features...')
    results = features.execute()
    # print('done')

    # print('Calculated GLDM features: ')
    for (key, val) in six.iteritems(results):
        GLDMFeatureName = '%s_%s' % ('GLDM', key)
        if GLDMFeatureName not in feature_vectors:
            feature_vectors[GLDMFeatureName] = val
        else:
            print('Error: GLDM key existing! %s'%GLDMFeatureName)
            # break
        # print('  ', key, ':', val)

    print('ADDED %s GLDM Features'%len(results))

    #
    # Show FirstOrder features, calculated on a LoG filtered image
    #
    if applyLog:
      sigmaValues = np.arange(5., 0., -.5)[::1]
      cnt = 0
      for logImage, imageTypeName, inputKwargs in imageoperations.getLoGImage(image, mask, sigma=sigmaValues):
        cnt += 1
        features = firstorder.RadiomicsFirstOrder(logImage, mask, **inputKwargs)
        features.enableAllFeatures()
        results = features.execute()
        print('ADDEDING %s/%s Features...'%(cnt, len(logImage)))
        for (key, val) in six.iteritems(results):
            laplacianFeatureName = '%s_%s' % (imageTypeName, key)
            if laplacianFeatureName not in feature_vectors:
                feature_vectors[laplacianFeatureName] = val
            else:
                print('Error: LoG key existing! %s'%laplacianFeatureName)
                # break
            # print('  ', laplacianFeatureName, ':', val)
    #
    # Show FirstOrder features, calculated on a wavelet filtered image
    #
    if applyWavelet:
        cnt = 0
        for decompositionImage, decompositionName, inputKwargs in imageoperations.getWaveletImage(image, mask):
            cnt+=1
            features = firstorder.RadiomicsFirstOrder(decompositionImage, mask, **inputKwargs)
            features.enableAllFeatures()
            results = features.execute()
            print('ADDEDING %s/%s WAVELET Features...'%(cnt, str(decompositionName)))
            print('Calculated firstorder features with wavelet ', decompositionName)
            for (key, val) in six.iteritems(results):
                waveletFeatureName = '%s_%s' % (str(decompositionName), key)
                if waveletFeatureName not in feature_vectors:
                    feature_vectors[waveletFeatureName] = val
                else:
                    print('Error: wavelet key existing! %s'%waveletFeatureName)
                    # break
                # print('  ', waveletFeatureName, ':', val)

    mask = None
    image = None
    features = None
    os.remove(cache_file)
    print('DONE!')
    return feature_vectors
Exemplo n.º 9
0
def features_extractor(patients_nrrd_path, valid_IDs, applyLog = False, applyWavelet = False):
    feature_vectors = {}
    cnt = 0
    for case_id in valid_IDs:
        feature_vectors[case_id] = {}
        cnt += 1
        # try:
        ct_nrrd_path = os.path.join(patients_nrrd_path,case_id, "image.nrrd")
        ss_nrrd_path = os.path.join(patients_nrrd_path,case_id, "mask.nrrd")
        print("Reading ct image")
        image = sitk.ReadImage(ct_nrrd_path)
        # image, header = nrrd.read(ct_nrrd_path)
        print("Reading roi mask")
        mask = sitk.ReadImage(ss_nrrd_path)
        # mask, header = nrrd.read(ss_nrrd_path)
        print("Getting ct image array")
        image_array = sitk.GetArrayFromImage(image)
        print("Getting roi mask array")
        mask_array = sitk.GetArrayFromImage(mask)
        print(image_array.shape, mask_array.shape)
        # simple_plot_nrrd(image_array, mask_array, sliceNumber=75, plotSrc='sitk')
        print (cnt, "_ Calculating features: ",case_id)   

        settings = {'binWidth': 25,
                'interpolator': sitk.sitkBSpline,
                'resampledPixelSpacing': None}
        interpolator = settings.get('interpolator')
        resampledPixelSpacing = settings.get('resampledPixelSpacing')
        if interpolator is not None and resampledPixelSpacing is not None:
            image, mask = imageoperations.resampleImage(image, mask, **settings)
        bb, correctedMask = imageoperations.checkMask(image, mask)
        if correctedMask is not None:
          mask = correctedMask
        image, mask = imageoperations.cropToTumorMask(image, mask, bb)
        
        firstOrderFeatures = firstorder.RadiomicsFirstOrder(image, mask, **settings)
        # firstOrderFeatures.enableFeatureByName('Mean', True)
        firstOrderFeatures.enableAllFeatures()

        # print('Will calculate the following first order features: ')
        # for f in firstOrderFeatures.enabledFeatures.keys():
        #   print('  ', f)
        #   print(getattr(firstOrderFeatures, 'get%sFeatureValue' % f).__doc__)

        # print('Calculating first order features...')
        results = firstOrderFeatures.execute()
        # print('done')

        print('Calculated first order features: ')
        for (key, val) in six.iteritems(results):
            firstOrderFeatureName = '%s_%s' % ('firstOrder', key)
            if firstOrderFeatureName not in feature_vectors[case_id]:
                feature_vectors[case_id][firstOrderFeatureName] = val
            else:
                print('Error: firstOrder key existing! %s'%firstOrderFeatureName)
                # break
            # print('  ', key, ':', val)

        #
        # Show Shape features
        #

        shapeFeatures = shape.RadiomicsShape(image, mask, **settings)
        shapeFeatures.enableAllFeatures()

        # print('Will calculate the following Shape features: ')
        # for f in shapeFeatures.enabledFeatures.keys():
        #   print('  ', f)
        #   print(getattr(shapeFeatures, 'get%sFeatureValue' % f).__doc__)

        # print('Calculating Shape features...')
        results = shapeFeatures.execute()
        # print('done')

        print('Calculated Shape features: ')
        for (key, val) in six.iteritems(results):
            ShapeFeatureName = '%s_%s' % ('Shape', key)
            if ShapeFeatureName not in feature_vectors[case_id]:
                feature_vectors[case_id][ShapeFeatureName] = val
            else:
                print('Error: shape key existing! %s'%ShapeFeatureName)
                # break
            # print('  ', key, ':', val)

        #
        # Show GLCM features: Gray Level Co-occurrence Matrix (GLCM) Features
        #
        glcmFeatures = glcm.RadiomicsGLCM(image, mask, **settings)
        glcmFeatures.enableAllFeatures()

        # print('Will calculate the following GLCM features: ')
        # for f in glcmFeatures.enabledFeatures.keys():
        #   print('  ', f)
        #   print(getattr(glcmFeatures, 'get%sFeatureValue' % f).__doc__)

        # print('Calculating GLCM features...')
        results = glcmFeatures.execute()
        # print('done')

        print('Calculated GLCM features: ')
        for (key, val) in six.iteritems(results):
            GLCMFeatureName = '%s_%s' % ('GLCM', key)
            if GLCMFeatureName not in feature_vectors[case_id]:
                feature_vectors[case_id][GLCMFeatureName] = val
            else:
                print('Error: GLCM key existing! %s'%GLCMFeatureName)
                # break
            # print('  ', key, ':', val)



        #
        # Show GLSZM features; Gray Level Size Zone Matrix (GLSZM) Features
        #
        glszmFeatures = glszm.RadiomicsGLSZM(image, mask, **settings)
        glszmFeatures.enableAllFeatures()

        # print('Will calculate the following GLSZM features: ')
        # for f in glszmFeatures.enabledFeatures.keys():
        #   print('  ', f)
        #   print(getattr(glszmFeatures, 'get%sFeatureValue' % f).__doc__)

        # print('Calculating GLSZM features...')
        results = glszmFeatures.execute()
        print('done')

        print('Calculated GLSZM features: ')
        for (key, val) in six.iteritems(results):
            GLSZMFeatureName = '%s_%s' % ('GLSZM', key)
            if GLSZMFeatureName not in feature_vectors[case_id]:
                feature_vectors[case_id][GLSZMFeatureName] = val
            else:
                print('Error: GLSZM key existing! %s'%GLSZMFeatureName)
                # break
            # print('  ', key, ':', val)


        #
        # Show GLRLM features; Gray Level Run Length Matrix (GLRLM) Features
        #
        glrlmFeatures = glrlm.RadiomicsGLRLM(image, mask, **settings)
        glrlmFeatures.enableAllFeatures()

        # print('Will calculate the following GLRLM features: ')
        # for f in glrlmFeatures.enabledFeatures.keys():
        #   print('  ', f)
        #   print(getattr(glrlmFeatures, 'get%sFeatureValue' % f).__doc__)

        # print('Calculating GLRLM features...')
        results = glrlmFeatures.execute()
        # print('done')

        print('Calculated GLRLM features: ')
        for (key, val) in six.iteritems(results):
            GLRLMFeatureName = '%s_%s' % ('GLRLM', key)
            if GLRLMFeatureName not in feature_vectors[case_id]:
                feature_vectors[case_id][GLRLMFeatureName] = val
            else:
                print('Error: GLRLM key existing! %s'%GLRLMFeatureName)
                # break
            # print('  ', key, ':', val)

        #
        # Show NGTDM features; Neighbouring Gray Tone Difference Matrix (NGTDM) Features
        #
        ngtdmFeatures = ngtdm.RadiomicsNGTDM(image, mask, **settings)
        ngtdmFeatures.enableAllFeatures()

        # print('Will calculate the following NGTDM features: ')
        # for f in ngtdmFeatures.enabledFeatures.keys():
        #   print('  ', f)
        #   print(getattr(ngtdmFeatures, 'get%sFeatureValue' % f).__doc__)

        # print('Calculating NGTDM features...')
        results = ngtdmFeatures.execute()
        # print('done')

        print('Calculated NGTDM features: ')
        for (key, val) in six.iteritems(results):
            NGTDMFeatureName = '%s_%s' % ('NGTDM', key)
            if NGTDMFeatureName not in feature_vectors[case_id]:
                feature_vectors[case_id][NGTDMFeatureName] = val
            else:
                print('Error: NGTDM key existing! %s'%NGTDMFeatureName)
                # break
            # print('  ', key, ':', val)

        #
        # Show GLDM features; Gray Level Dependence Matrix (GLDM) Features
        #
        gldmFeatures = gldm.RadiomicsGLDM(image, mask, **settings)
        gldmFeatures.enableAllFeatures()

        # print('Will calculate the following GLDM features: ')
        # for f in gldmFeatures.enabledFeatures.keys():
        #   print('  ', f)
        #   print(getattr(gldmFeatures, 'get%sFeatureValue' % f).__doc__)

        # print('Calculating GLDM features...')
        results = gldmFeatures.execute()
        # print('done')

        print('Calculated GLDM features: ')
        for (key, val) in six.iteritems(results):
            GLDMFeatureName = '%s_%s' % ('GLDM', key)
            if GLDMFeatureName not in feature_vectors[case_id]:
                feature_vectors[case_id][GLDMFeatureName] = val
            else:
                print('Error: GLDM key existing! %s'%GLDMFeatureName)
                # break
            # print('  ', key, ':', val)


        #
        # Show FirstOrder features, calculated on a LoG filtered image
        #
        if applyLog:
          sigmaValues = np.arange(5., 0., -.5)[::1]
          for logImage, imageTypeName, inputKwargs in imageoperations.getLoGImage(image, mask, sigma=sigmaValues):
            logFirstorderFeatures = firstorder.RadiomicsFirstOrder(logImage, mask, **inputKwargs)
            logFirstorderFeatures.enableAllFeatures()
            results = logFirstorderFeatures.execute()
            for (key, val) in np.iteritems(results):
                laplacianFeatureName = '%s_%s' % (imageTypeName, key)
                if laplacianFeatureName not in feature_vectors[case_id]:
                    feature_vectors[case_id][laplacianFeatureName] = val
                else:
                    print('Error: LoG key existing! %s'%laplacianFeatureName)
                    # break
                # print('  ', laplacianFeatureName, ':', val)
        #
        # Show FirstOrder features, calculated on a wavelet filtered image
        #
        if applyWavelet:
          for decompositionImage, decompositionName, inputKwargs in imageoperations.getWaveletImage(image, mask):
            waveletFirstOrderFeaturs = firstorder.RadiomicsFirstOrder(decompositionImage, mask, **inputKwargs)
            waveletFirstOrderFeaturs.enableAllFeatures()
            results = waveletFirstOrderFeaturs.execute()
            print('Calculated firstorder features with wavelet ', decompositionName)
            for (key, val) in six.iteritems(results):
                waveletFeatureName = '%s_%s' % (str(decompositionName), key)
                if waveletFeatureName not in feature_vectors[case_id]:
                    feature_vectors[case_id][waveletFeatureName] = val
                else:
                    print('Error: wavelet key existing! %s'%waveletFeatureName)
                    # break
                # print('  ', waveletFeatureName, ':', val)

        mask = None
        image = None
    return feature_vectors