Пример #1
0
 def test_is_philips(self):
     assert common.is_philips(
         read_dicom_directory(test_data.PHILIPS_ANATOMICAL))
     assert not common.is_philips(
         read_dicom_directory(test_data.SIEMENS_ANATOMICAL))
     assert not common.is_philips(
         read_dicom_directory(test_data.GE_ANATOMICAL))
     assert not common.is_philips(
         read_dicom_directory(test_data.GENERIC_ANATOMICAL))
     assert not common.is_philips(
         read_dicom_directory(test_data.HITACHI_ANATOMICAL))
Пример #2
0
def _is_valid_imaging_dicom(dicom_header):
    """
    Function will do some basic checks to see if this is a valid imaging dicom
    """
    # if it is philips and multiframe dicom then we assume it is ok
    try:
        if common.is_philips([dicom_header]):
            if common.is_multiframe_dicom([dicom_header]):
                return True

        if "SeriesInstanceUID" not in dicom_header:
            return False

        if "InstanceNumber" not in dicom_header:
            return False

        if "ImageOrientationPatient" not in dicom_header or len(dicom_header.ImageOrientationPatient) < 6:
            return False

        if "ImagePositionPatient" not in dicom_header or len(dicom_header.ImagePositionPatient) < 3:
            return False

        # for all others if there is image position patient we assume it is ok
        if Tag(0x0020, 0x0037) not in dicom_header:
            return False

        return True
    except (KeyError, AttributeError):
        return False
Пример #3
0
def _is_valid_imaging_dicom(dicom_header):
    """
    Function will do some basic checks to see if this is a valid imaging dicom
    """
    # if it is philips and multiframe dicom then we assume it is ok
    try:
        if common.is_philips([dicom_header]):
            if common.is_multiframe_dicom([dicom_header]):
                return True

        if "SeriesInstanceUID" not in dicom_header:
            return False

        if "InstanceNumber" not in dicom_header:
            return False

        if "ImageOrientationPatient" not in dicom_header or len(dicom_header.ImageOrientationPatient) < 6:
            return False

        if "ImagePositionPatient" not in dicom_header or len(dicom_header.ImagePositionPatient) < 3:
            return False

        # for all others if there is image position patient we assume it is ok
        if Tag(0x0020, 0x0037) not in dicom_header:
            return False

        return True
    except (KeyError, AttributeError):
        return False
Пример #4
0
def dicom_to_nifti(dicom_input, output_file=None):
    """
    This is the main dicom to nifti conversion fuction for philips images.
    As input philips images are required. It will then determine the type of images and do the correct conversion

    Examples: See unit test

    :param output_file: file path to the output nifti
    :param dicom_input: directory with dicom files for 1 scan
    """

    assert common.is_philips(dicom_input)

    if common.is_multiframe_dicom(dicom_input):
        _assert_explicit_vr(dicom_input)
        logger.info('Found multiframe dicom')
        if _is_multiframe_4d(dicom_input):
            logger.info('Found sequence type: MULTIFRAME 4D')
            return _multiframe_to_nifti(dicom_input, output_file)

        if _is_multiframe_anatomical(dicom_input):
            logger.info('Found sequence type: MULTIFRAME ANATOMICAL')
            return _multiframe_to_nifti(dicom_input, output_file)
    else:
        logger.info('Found singleframe dicom')
        grouped_dicoms = _get_grouped_dicoms(dicom_input)
        if _is_singleframe_4d(dicom_input):
            logger.info('Found sequence type: SINGLEFRAME 4D')
            return _singleframe_to_nifti(grouped_dicoms, output_file)

    logger.info('Assuming anatomical data')
    return convert_generic.dicom_to_nifti(dicom_input, output_file)
Пример #5
0
def dicom_to_nifti(dicom_input, output_file=None):
    """
    This is the main dicom to nifti conversion fuction for philips images.
    As input philips images are required. It will then determine the type of images and do the correct conversion

    Examples: See unit test

    :param output_file: file path to the output nifti
    :param dicom_input: directory with dicom files for 1 scan
    """

    assert common.is_philips(dicom_input)

    if common.is_multiframe_dicom(dicom_input):
        _assert_explicit_vr(dicom_input)
        logger.info('Found multiframe dicom')
        if _is_multiframe_4d(dicom_input):
            logger.info('Found sequence type: MULTIFRAME 4D')
            return _multiframe_to_nifti(dicom_input, output_file)

        if _is_multiframe_anatomical(dicom_input):
            logger.info('Found sequence type: MULTIFRAME ANATOMICAL')
            return _multiframe_to_nifti(dicom_input, output_file)
    else:
        logger.info('Found singleframe dicom')
        grouped_dicoms = _get_grouped_dicoms(dicom_input)
        if _is_singleframe_4d(dicom_input):
            logger.info('Found sequence type: SINGLEFRAME 4D')
            return _singleframe_to_nifti(grouped_dicoms, output_file)

    logger.info('Assuming anatomical data')
    return convert_generic.dicom_to_nifti(dicom_input, output_file)
Пример #6
0
def are_imaging_dicoms(dicom_input):
    """
    This function will check the dicom headers to see which type of series it is
    Possibilities are fMRI, DTI, Anatomical (if no clear type is found anatomical is used)

    :param dicom_input: directory with dicom files or a list of dicom objects
    """

    # if it is philips and multiframe dicom then we assume it is ok
    if common.is_philips(dicom_input):
        if common.is_multiframe_dicom(dicom_input):
            return True

    # for all others if there is image position patient we assume it is ok
    header = dicom_input[0]
    return Tag(0x0020, 0x0037) in header
Пример #7
0
def are_imaging_dicoms(dicom_input):
    """
    This function will check the dicom headers to see which type of series it is
    Possibilities are fMRI, DTI, Anatomical (if no clear type is found anatomical is used)

    :param dicom_input: directory with dicom files or a list of dicom objects
    """

    # if it is philips and multiframe dicom then we assume it is ok
    if common.is_philips(dicom_input):
        if common.is_multiframe_dicom(dicom_input):
            return True

    # for all others if there is image position patient we assume it is ok
    header = dicom_input[0]
    return Tag(0x0020, 0x0037) in header
Пример #8
0
def dicom_to_nifti(dicom_input, output_file=None):
    """
    This is the main dicom to nifti conversion fuction for philips images.
    As input philips images are required. It will then determine the type of images and do the correct conversion

    Examples: See unit test

    :param output_file: file path to the output nifti
    :param dicom_input: directory with dicom files for 1 scan
    """

    assert common.is_philips(dicom_input)

    # remove duplicate slices based on position and data
    dicom_input = convert_generic.remove_duplicate_slices(dicom_input)

    # remove localizers based on image type
    dicom_input = convert_generic.remove_localizers_by_imagetype(dicom_input)

    # remove_localizers based on image orientation (only valid if slicecount is validated)
    dicom_input = convert_generic.remove_localizers_by_orientation(dicom_input)

    # if no dicoms remain raise exception
    if not dicom_input:
        raise ConversionValidationError('TOO_FEW_SLICES/LOCALIZER')

    if common.is_multiframe_dicom(dicom_input):
        _assert_explicit_vr(dicom_input)
        logger.info('Found multiframe dicom')
        if _is_multiframe_4d(dicom_input):
            logger.info('Found sequence type: MULTIFRAME 4D')
            return _multiframe_to_nifti(dicom_input, output_file)

        if _is_multiframe_anatomical(dicom_input):
            logger.info('Found sequence type: MULTIFRAME ANATOMICAL')
            return _multiframe_to_nifti(dicom_input, output_file)
    else:
        logger.info('Found singleframe dicom')
        grouped_dicoms = _get_grouped_dicoms(dicom_input)
        if _is_singleframe_4d(dicom_input):
            logger.info('Found sequence type: SINGLEFRAME 4D')
            return _singleframe_to_nifti(grouped_dicoms, output_file)

    logger.info('Assuming anatomical data')
    return convert_generic.dicom_to_nifti(dicom_input, output_file)
Пример #9
0
def _get_vendor(dicom_input):
    """
    This function will check the dicom headers to see which type of series it is
    Possibilities are fMRI, DTI, Anatomical (if no clear type is found anatomical is used)
    """
    # check if it is siemens
    if common.is_siemens(dicom_input):
        logger.info('Found manufacturer: SIEMENS')
        return Vendor.SIEMENS
    # check if it is ge
    if common.is_ge(dicom_input):
        logger.info('Found manufacturer: GE')
        return Vendor.GE
    # check if it is philips
    if common.is_philips(dicom_input):
        logger.info('Found manufacturer: PHILIPS')
        return Vendor.PHILIPS
    # check if it is philips
    if common.is_hitachi(dicom_input):
        logger.info('Found manufacturer: HITACHI')
        return Vendor.HITACHI
    # generic by default
    logger.info('WARNING: Assuming generic vendor conversion (ANATOMICAL)')
    return Vendor.GENERIC
Пример #10
0
def _get_vendor(dicom_input):
    """
    This function will check the dicom headers to see which type of series it is
    Possibilities are fMRI, DTI, Anatomical (if no clear type is found anatomical is used)
    """
    # check if it is siemens
    if common.is_siemens(dicom_input):
        logger.info('Found manufacturer: SIEMENS')
        return Vendor.SIEMENS
    # check if it is ge
    if common.is_ge(dicom_input):
        logger.info('Found manufacturer: GE')
        return Vendor.GE
    # check if it is philips
    if common.is_philips(dicom_input):
        logger.info('Found manufacturer: PHILIPS')
        return Vendor.PHILIPS
    # check if it is philips
    if common.is_hitachi(dicom_input):
        logger.info('Found manufacturer: HITACHI')
        return Vendor.HITACHI
    # generic by default
    logger.info('WARNING: Assuming generic vendor conversion (ANATOMICAL)')
    return Vendor.GENERIC
Пример #11
0
 def test_is_philips(self):
     assert common.is_philips(read_dicom_directory(test_data.PHILIPS_ANATOMICAL))
     assert not common.is_philips(read_dicom_directory(test_data.SIEMENS_ANATOMICAL))
     assert not common.is_philips(read_dicom_directory(test_data.GE_ANATOMICAL))
     assert not common.is_philips(read_dicom_directory(test_data.GENERIC_ANATOMICAL))
     assert not common.is_philips(read_dicom_directory(test_data.HITACHI_ANATOMICAL))
Пример #12
0
def anonymize_directory(input_directory, output_directory=None):
    if output_directory is None:
        output_directory = input_directory

    study_uid = pydicom.uid.generate_uid()
    series_uid = pydicom.uid.generate_uid()
    date = datetime.datetime.now().strftime("%Y%m%d")
    time = datetime.datetime.now().strftime("%H%M%S.000000")

    fields_to_keep = {
        'SpecificCharacterSet':
        None,
        'ImageType':
        None,
        'AcquisitionMatrix':
        None,
        'SOPClassUID':
        None,
        'SOPInstanceUID':
        None,  # Will be replaced by file-unique UID
        'StudyDate':
        date,
        'SeriesDate':
        date,
        'AcquisitionDate':
        date,
        'ContentDate':
        date,
        'StudyTime':
        time,
        'AcquisitionTime':
        time,
        'AcquisitionNumber':
        None,
        'Modality':
        None,
        'Manufacturer':
        None,
        'ManufacturersModelName':
        None,
        'PatientName':
        'dicom2nifti',
        'PatientID':
        'dicom2nifti',
        'PatientsBirthDate':
        date,
        'PatientsSex':
        None,
        'PatientsAge':
        '0Y',
        'PatientPosition':
        None,
        'ScanningSequence':
        None,
        'SequenceVariant':
        None,
        'MRAcquisitionType':
        None,
        'SequenceName':
        'dicom2nifti',
        'RepetitionTime':
        None,
        'EchoTime':
        None,
        'InversionTime':
        None,
        'DeviceSerialNumber':
        '1234',
        'StudyInstanceUID':
        study_uid,
        'SeriesInstanceUID':
        series_uid,
        'StudyID':
        'dicom2nifti',
        'SeriesNumber':
        None,
        'InstanceNumber':
        None,
        'ImagePositionPatient':
        None,
        'ImageOrientationPatient':
        None,
        'SliceLocation':
        None,
        'PhotometricInterpretation':
        None,
        'Rows':
        None,
        'Columns':
        None,
        'PixelSpacing':
        None,
        'BitsAllocated':
        None,
        'BitsStored':
        None,
        'HighBit':
        None,
        'RescaleSlope':
        None,
        'RescaleIntercept':
        None,
        'PixelRepresentation':
        None,
        'NumberOfFrames':
        None,
        'SamplesPerPixel':
        None,
        'SpacingBetweenSlices':
        None,
        # Pixel Data must be specified with hex code as it will not work for compressed dicoms
        (0x7fe0, 0x0010):
        None
    }

    if is_philips(read_dicom_directory(input_directory)):
        philips_fields = {
            (0x2001, 0x100a): None,
            (0x2001, 0x1003): None,
            (0x2001, 0x105f): None,
            (0x2005, 0x100d): None,
            (0x2005, 0x100e): None,
            (0x2005, 0x10b0): None,
            (0x2005, 0x10b1): None,
            (0x2005, 0x10b2): None,
            (0x0018, 0x9087): None,
            (0x0018, 0x9089): None,
            (0x5200, 0x9230): None,
            'SharedFunctionalGroupsSequence': None
        }
        fields_to_keep.update(philips_fields)

    if is_siemens(read_dicom_directory(input_directory)):
        siemens_fields = {
            (0x0019, 0x100c): None,
            (0x0029, 0x1020): None,
            (0x0051, 0x100b): None,
            (0x0019, 0x100e): None
        }
        fields_to_keep.update(siemens_fields)

    if is_ge(read_dicom_directory(input_directory)):
        ge_fields = {
            (0x0020, 0x9056): None,
            (0x0020, 0x9057): None,
            (0x0043, 0x1039): None,
            (0x0019, 0x10bb): None,
            (0x0019, 0x10bc): None,
            (0x0019, 0x10bd): None
        }
        fields_to_keep.update(ge_fields)

    _anonymize_files(input_directory, output_directory, fields_to_keep)