def Normalize():
    root_folder = r'D:\ProblemData\Prcoessed'

    for case in os.listdir(root_folder):
        case_folder = os.path.join(root_folder, case)
        if not os.path.isdir(case_folder):
            continue

        print('Normalizing PZ of {}'.format(case))
        wg_path = os.path.join(case_folder, 'prostate_roi.nii.gz')
        cg_path = os.path.join(case_folder, 'cg.nii')
        if not os.path.exists(wg_path) and not os.path.exists(cg_path):
            continue

        wg_image, _, wg_data = LoadNiiData(wg_path, dtype=np.uint8)
        cg_image, _, cg_data = LoadNiiData(cg_path, dtype=np.uint8)

        print(np.unique(wg_data), np.unique(cg_data))

        if list(np.unique(wg_data)) == [0, 255]:
            wg = np.array(wg_data / 255, dtype=np.uint8)
        else:
            wg = wg_data

        if list(np.unique(cg_data)) == [0, 255]:
            cg = np.array(cg_data / 255, dtype=np.uint8)
        else:
            cg = cg_data

        wg_array = GetImageFromArrayByImage(wg, wg_image)
        cg_array = GetImageFromArrayByImage(cg, wg_image)
        SaveNiiImage(os.path.join(case_folder, 'normalize_prostate_roi.nii'),
                     wg_array)
        SaveNiiImage(os.path.join(case_folder, 'normalize_cg.nii'), cg_array)
        print(np.unique(wg), np.unique(cg))
def MergePzAndTz():
    from MeDIT.Visualization import Imshow3DArray
    from MeDIT.Normalize import Normalize01
    root_folder = r'D:\ProblemData\Prcoessed'

    for case in os.listdir(root_folder):
        case_folder = os.path.join(root_folder, case)
        if not os.path.isdir(case_folder):
            continue

        print('Estimating PZ of {}'.format(case))
        cg_path = os.path.join(case_folder, 'cg.nii')
        pz_path = os.path.join(case_folder, 'pz.nii')

        cg_image, _, cg_data = LoadNiiData(cg_path, dtype=np.uint8)
        pz_image, _, pz_data = LoadNiiData(pz_path, dtype=np.uint8)

        # Merge
        merge_roi = pz_data + 2 * cg_data
        # Imshow3DArray(np.concatenate((Normalize01(cg_data), Normalize01(pz_data), Normalize01(merge_roi)), axis=1))
        # print(np.unique(merge_roi))

        # Save PZ image
        merge_image = GetImageFromArrayByImage(merge_roi, pz_image)
        SaveNiiImage(os.path.join(case_folder, 'merge_pz1_cg2.nii'),
                     merge_image)
示例#3
0
    def Run(self, image, store_folder=''):
        if isinstance(image, str):
            image = sitk.ReadImage(image)

        resolution = image.GetSpacing()
        flip_log = [0, 0, 0]
        _, data = GetDataFromSimpleITK(image,
                                       dtype=np.float32,
                                       is_flip=False,
                                       flip_log=flip_log)

        # Preprocess Data
        data = self._config.CropDataShape(data, resolution)
        input_list = self.TransOneDataFor2_5DModel(data)

        with self.graph.as_default():
            # 多监督模型输出三个,第一个为于是大小尺寸
            preds_list = self._model.predict(input_list)

        pred = preds_list[0]
        pred = np.argmax(pred, axis=-1)

        pred = self.invTransDataFor2_5DModel(pred)

        pred = self._config.RecoverDataShape(pred, resolution)
        pred = self.__FilterResult(pred)

        new_pred = self.__KeepLargest(np.round(pred))

        mask_image = GetImageFromArrayByImage(new_pred,
                                              image,
                                              flip_log=flip_log)
        if store_folder:
            if os.path.isdir(store_folder):
                store_folder = os.path.join(
                    store_folder, '{}.nii.gz'.format(self._config.GetName()))
            SaveNiiImage(store_folder, mask_image)

        return new_pred, mask_image
示例#4
0
def Normalize(process_folder, resampe_folder):
    for case in os.listdir(process_folder):
        case_folder = os.path.join(process_folder, case)
        store_case_folder = os.path.join(resampe_folder, case)
        if not os.path.exists(store_case_folder):
            os.mkdir(store_case_folder)

        print('Normalizing {}'.format(case))
        roi_path = os.path.join(case_folder, 'roi.nii')
        if not os.path.exists(roi_path):
            continue

        roi_image, _, roi_data = LoadImage(roi_path, dtype=np.uint8)

        if list(np.unique(roi_data)) == [0, 255]:
            roi = np.array(roi_data / 255, dtype=np.uint8)
        else:
            roi = roi_data
        roi_array = GetImageFromArrayByImage(roi, roi_image)
        SaveNiiImage(os.path.join(store_case_folder, 'normalize_roi.nii'),
                     roi_array)
        if os.path.exists(os.path.join(case_folder, 'normalize_roi.nii')):
            os.remove(os.path.join(case_folder, 'normalize_roi.nii'))
def GetPzRegion():
    root_folder = r'D:\ProblemData\Prcoessed'

    for case in os.listdir(root_folder):
        case_folder = os.path.join(root_folder, case)
        if not os.path.isdir(case_folder):
            continue

        print('Estimating PZ of {}'.format(case))
        wg_path = os.path.join(case_folder, 'prostate_roi.nii.gz')
        cg_path = os.path.join(case_folder, 'cg.nii')
        t2_path = os.path.join(case_folder, 't2.nii')
        if not os.path.exists(wg_path) and not os.path.exists(cg_path):
            continue

        wg_image, _, wg_data = LoadNiiData(wg_path, dtype=np.uint8)
        cg_image, _, cg_data = LoadNiiData(cg_path, dtype=np.uint8)

        # # Calculating PZ
        pz_data = wg_data - cg_data
        # print(np.unique(pz_data))
        pz_data[pz_data == 255] = 0

        # from MeDIT.Visualization import Imshow3DArray
        # from MeDIT.Normalize import Normalize01
        #
        # _, _, t2 = LoadNiiData(t2_path)
        #
        # Imshow3DArray(np.concatenate([Normalize01(t2), Normalize01(t2)], axis=1), roi=np.concatenate([pz_data0, pz_data], axis=1))
        #
        # print(np.unique(pz_data), np.unique(wg_data), np.unique(cg_data))

        # Save PZ image
        pz_image = GetImageFromArrayByImage(pz_data, wg_image)

        SaveNiiImage(os.path.join(case_folder, 'pz.nii'), pz_image)
示例#6
0
def SaveNumpyToImageByRef(store_path, data, ref_image):
    image = GetImageFromArrayByImage(data, ref_image)
    image.CopyInformation(ref_image)
    sitk.WriteImage(image, store_path)
示例#7
0
def LoadFreeSurferLabel(ref_image_path, label_file, store_folder=''):
    if store_folder:
        if not os.path.exists(store_folder):
            os.mkdir(store_folder)

    def _GetLabel(label_path):
        with open(label_path, 'r') as file:
            lines = file.readlines()
            position_list = []
            for line in lines[2:]:
                one_line = line.split(' ')
                one_line = [index for index in one_line if index != '']
                position_list.append([
                    float(one_line[1]),
                    float(one_line[2]),
                    float(one_line[3])
                ])

        return position_list

    if not (isinstance(ref_image_path, str) and isinstance(label_file, str)):
        print('The input must be file path (string)')
    flip_log = [0, 0, 0]
    if ref_image_path.endswith('.mgz'):
        temp_image = nb.load(ref_image_path)
        if store_folder:
            nb.save(temp_image,
                    os.path.join(store_folder, 'transfer_image.nii.gz'))
            image, data, show_data = LoadNiiData(os.path.join(
                store_folder, 'transfer_image.nii.gz'),
                                                 is_flip=flip_log)
        else:
            temp_image_path = 'temp_image.nii.gz'
            nb.save(temp_image, temp_image_path)
            image, data, show_data = LoadNiiData(temp_image_path,
                                                 is_flip=flip_log)
            os.remove(temp_image_path)

    if ref_image_path.endswith('.nii') or ref_image_path.endswith('.nii.gz'):
        image, data, show_data = LoadNiiData(ref_image_path, is_flip=flip_log)

    origion = image.GetOrigin()
    image.SetOrigin((128, 128, 128))
    position_list = _GetLabel(label_file)
    index_list = list(
        set([
            image.TransformPhysicalPointToIndex(position)
            for position in position_list
        ]))
    mask = np.zeros((image.GetSize()), dtype=np.uint8)
    for index in index_list:
        mask[index[1], index[0], index[2]] = 1

    if store_folder:
        from MeDIT.ImageProcess import GetImageFromArrayByImage
        image.SetOrigin(origion)
        store_image = GetImageFromArrayByImage(mask,
                                               image,
                                               is_transfer_axis=True)
        SaveNiiImage(os.path.join(store_folder, 'label.nii.gz'), store_image)

    return show_data, mask
示例#8
0
    def Run(self,
            image,
            model_folder_path,
            store_folder='',
            is_return_all_data=False):
        resolution = image.GetSpacing()
        _, data = GetDataFromSimpleITK(image, dtype=np.float32)

        self._image_preparer.LoadModelConfig(
            os.path.join(model_folder_path, 'config.ini'))
        ''' 2) Select Data'''
        data = self._image_preparer.CropDataShape(data, resolution)
        data = self.TransDataFor2DModel(data)
        data = NormalizeForTensorflow(data)

        preds = self._loaded_model.predict(data)

        if is_return_all_data:
            data = np.squeeze(data)
            preds = np.squeeze(preds)
            pred1 = preds[:, :np.prod(data.shape[1:3]) // 16]
            pred2 = preds[:,
                          np.prod(data.shape[1:3]) //
                          16:-np.prod(data.shape[1:3])]
            pred3 = preds[:, -np.prod(data.shape[1:3]):]

            pred1 = np.reshape(
                pred1, (data.shape[0], data.shape[1] // 4, data.shape[2] // 4))
            pred2 = np.reshape(
                pred2, (data.shape[0], data.shape[1] // 2, data.shape[2] // 2))
            pred3 = np.reshape(pred3,
                               (data.shape[0], data.shape[1], data.shape[2]))

            import cv2
            data1 = np.zeros(
                (data.shape[0], data.shape[1] // 4, data.shape[2] // 4))
            data2 = np.zeros(
                (data.shape[0], data.shape[1] // 2, data.shape[2] // 2))

            for slice_index in range(data.shape[0]):
                data1[slice_index, ...] = cv2.resize(
                    data[slice_index,
                         ...], (data.shape[1] // 4, data.shape[2] // 4))
                data2[slice_index, ...] = cv2.resize(
                    data[slice_index,
                         ...], (data.shape[1] // 2, data.shape[2] // 2))

            data1 = np.transpose(data1, (1, 2, 0))
            data2 = np.transpose(data2, (1, 2, 0))
            data3 = np.transpose(data, (1, 2, 0))

            pred1 = np.transpose(pred1, (1, 2, 0))
            pred2 = np.transpose(pred2, (1, 2, 0))
            pred3 = np.transpose(pred3, (1, 2, 0))

            return [data1, data2, data3], [pred1, pred2, pred3]

        preds = preds[:, -np.prod(self._image_preparer.GetShape()):, :]
        preds = np.reshape(preds,
                           (data.shape[0], self._image_preparer.GetShape()[0],
                            self._image_preparer.GetShape()[1]))

        # ct the ROI
        preds = self.invTransDataFor2DModel(preds)
        preds = self._image_preparer.RecoverDataShape(preds, resolution)

        mask = np.asarray(preds > 0.5, dtype=np.uint8)
        mask = self.__KeepLargest(mask)

        # To process the extremely cases
        final_shape = image.GetSize()
        final_shape = [final_shape[1], final_shape[0], final_shape[2]]
        mask = Crop3DImage(mask, final_shape)

        mask_image = GetImageFromArrayByImage(mask, image)
        if store_folder:
            if os.path.isdir(store_folder):
                store_folder = os.path.join(store_folder,
                                            'prostate_roi.nii.gz')
            SaveNiiImage(store_folder, mask_image)

        return preds, mask, mask_image