예제 #1
0
    def read_file(self):
        #print(self.dir_name)
        #print(self.file_index)
        #print(len(self.image_fname))
        print(self.image_fname[self.random_batch[self.file_index]])
        print(self.dir_name + '/' + self.dir_image + '/' + self.image_fname[self.random_batch[self.file_index]])

        image = m2n.loadimage(self.dir_name + '/' + self.dir_image + '/' + self.image_fname[self.random_batch[self.file_index]])
        _, mask, str_name = m2n.parsemask(self.dir_name + '/' + self.dir_mask + '/' + self.mask_fname[self.random_batch[self.file_index]])
        mask = mask[self.mask_index[self.random_batch[self.file_index]]]

        # Broadcasting from int32 to float64/32(?) is mandatory for resizing images without pixel value change!
        image = np.float64(image)
        mask = np.float64(mask)

        print(str_name[self.mask_index[self.random_batch[self.file_index]]])

        self.file_index += 1

        if self.opt_resize == True and self.opt_crop == True:
            print("Both resize and crop are selected. Please choose either one")

        # resize 2-D N number of image (N x width x height)
        if self.opt_resize == True:
            print("image is resized")
            image = dpp.resize_3d(dcmimage=image, resize_shape=self.resize_shape)
            mask = dpp.resize_3d(dcmimage=mask, resize_shape=self.resize_shape)

        # crop 2-D N number of image (N x width x height)
        if self.opt_crop == True:
            print("image is cropped")
            image = dpp.crop_3d(dcmimage=image, crop_shape=self.crop_shape)
            mask = dpp.crop_3d(dcmimage=mask, crop_shape=self.crop_shape)

        return image, mask
예제 #2
0
    def read_file(self):
        #print(self.dir_name)
        #print(self.file_index)
        #print(len(self.image_fname))

        image = m2n.loadimage(self.dir_name + '/image/' +
                              self.image_fname[self.file_index])
        _, mask, str_name = m2n.parsemask(self.dir_name + '/mask/' +
                                          self.mask_fname[self.file_index])
        mask = mask[self.mask_index[self.file_index]]

        # Broadcasting from int32 to float64/32(?) is mandatory for resizing images without pixel value change!
        image = np.float64(image)
        mask = np.float64(mask)

        print(str_name[self.mask_index[self.file_index]])

        self.file_index += 1

        # resize 2-D N number of image (N x width x height)
        image = dpp.resize_3d(dcmimage=image, resize_shape=self.resize_shape)
        mask = dpp.resize_3d(dcmimage=mask, resize_shape=self.resize_shape)

        return image, mask
예제 #3
0
    def __init__(self, dir_name='DICOM_data/training_set', dir_image='image', dir_mask='mask',contour_name='mandible', zero_slices=False, opt_resize=True,
                 resize_shape=(224,224), opt_crop=False, crop_shape=(224,224),
                 rotation=True, rotation_angle=[90], bitsampling=True, bitsampling_bit=[4]):
        self.voxel_range = np.array([0,3000]) # any voxel bigger than 3000 would be 3000, less than 0 would be 0
        self.normalization_range = np.array([0,255])
        self.dir_name = dir_name
        self.zero_slices = zero_slices # Not taking account of the slices with no mask pixel

        self.file_index = 0
        self.slice_index = 0

        self.opt_resize = opt_resize
        self.resize_shape = resize_shape  # for VGG16 and VGG19. for inception, (299,299) used
        self.opt_crop = opt_crop
        self.crop_shape = crop_shape

        self.num_channel = 3              # 3 channel input

        # Data Augmentation options
        self.rotation = rotation
        self.rotation_angle = rotation_angle
        self.bitsampling = bitsampling
        self.bitsampling_bit = bitsampling_bit
        self.dir_image = dir_image
        self.dir_mask = dir_mask

        mask_fname = []
        mask_index = []

        # Only choose the dataset with given contour name & exclude the
        for file in glob.glob(self.dir_name + '/' + self.dir_mask + '/*.mat'):
            num_str, mask, name = m2n.parsemask(file)

            for i in range(num_str):
                if contour_name in name[i][0].lower():
                    mask_index.append(i)
                    mask_fname.append(os.path.basename(file))
                    break

        # Matching mask with img
        image_fname = [0]*len(mask_fname)

        for file in glob.glob(self.dir_name + '/' + self.dir_image + "/*.mat"):
            img_name = os.path.basename(file)
            for masks in mask_fname:
                if re.split("[._]", img_name)[1] == re.split("[._]",masks)[1]:
                    idx = mask_fname.index(masks)
                    image_fname[idx] = img_name

        # To check if mask & image matched in order
        # for i in range(len(mask_fname)):
        #    print(image_fname[i], mask_fname[i], mask_index[i])

        self.image_fname = image_fname
        self.mask_fname = mask_fname
        self.mask_index = mask_index
        self.num_files = len(mask_fname)

        # Randomize the order of data
        print("Num files : ", self.num_files)
        self.random_batch = random.sample(range(0,self.num_files),self.num_files)
        print("random_batch: ", self.random_batch)

        self.image, self.mask = self.read_file()
예제 #4
0
    def __init__(self,
                 dir_name='DICOM_data/training_set',
                 contour_name='mandible',
                 zero_slices=False,
                 resize_shape=(227, 227),
                 rotation=True,
                 rotation_angle=[90],
                 bitsampling=True,
                 bitsampling_bit=[4]):
        self.voxel_range = np.array(
            [-1000, 1000]
        )  # any voxel bigger than 1000 would be 1000, less than -1000 would be -1000
        self.normalization_range = np.array([0, 255])
        self.dir_name = dir_name
        self.contour_name = contour_name
        self.zero_slices = zero_slices  # Not taking account of the slices with no mask pixel

        self.file_index = 0
        self.slice_index = 0

        self.resize_shape = resize_shape  # for VGG16 and VGG19. for inception, (299,299) used
        self.num_channel = 3  # 3 channel input

        # Data Augmentation options
        self.rotation = rotation
        self.rotation_angle = rotation_angle
        self.bitsampling = bitsampling
        self.bitsampling_bit = bitsampling_bit

        mask_fname = []
        mask_index = []

        # Only choose the dataset with given contour name
        for file in glob.glob(self.dir_name + "/mask/*.mat"):
            num_str, mask, name = m2n.parsemask(file)

            for i in range(num_str):
                if name[i][0].lower() == self.contour_name:
                    mask_index.append(i)
                    mask_fname.append(os.path.basename(file))
                    break

        # Matching mask with img
        image_fname = [0] * len(mask_fname)

        for file in glob.glob(self.dir_name + "/image/*.mat"):
            img_name = os.path.basename(file)
            for masks in mask_fname:
                if re.split("[._]", img_name)[1] == re.split("[._]", masks)[1]:
                    idx = mask_fname.index(masks)
                    image_fname[idx] = img_name

        # To check if mask & image matched in order
        # for i in range(len(mask_fname)):
        #    print(image_fname[i], mask_fname[i], mask_index[i])

        self.image_fname = image_fname
        self.mask_fname = mask_fname
        self.mask_index = mask_index
        self.num_files = len(mask_fname)

        self.image, self.mask = self.read_file()