【问题标题】:Error While converting Dicom tags into excel using python使用python将Dicom标签转换为excel时出错
【发布时间】:2020-09-10 13:04:00
【问题描述】:

我正在尝试将 .dcm 文件中的 DICOM 标签转换并列出到 Excel 中(使用 pydicom),但转换时显示错误

一些标签在 Excel 文件中显示“无”,尽管它们包含/显示 DICOM 格式的数据(“FileMetaInformationGroupLength”、“FileMetaInformationVersion”、“MediaStorageSOPClassUID”、“MediaStorageSOPInstanceUID”、“TransferSyntaxUID”)。我该如何解决这个问题?

我该如何解决这个问题?

这是我的代码:

    import xlsxwriter 
    import sys 
    import pydicom 
    import os.path
    from pydicom.valuerep import PersonName
    keywords = ('FileMetaInformationGroupLength', 'FileMetaInformationVersion', 'MediaStorageSOPClassUID', 'MediaStorageSOPInstanceUID', 'TransferSyntaxUID', 'ImplementationClassUID', 'ImplementationVersionName', 'SpecificCharacterSet', 'ImageType', 'SOPClassUID', 'SOPInstanceUID', 'StudyDate', 'SeriesDate', 'AcquisitionDate', 'ContentDate', 'StudyTime', 'SeriesTime', 'AcquisitionTime', 'ContentTime', 'AccessionNumber', 'Modality', 'PresentationIntentType', 'Manufacturer', 'InstitutionName', 'InstitutionAddress', 'ReferringPhysicianName', 'StationName', 'StudyDescription', 'SeriesDescription', 'InstitutionalDepartmentName', 'ManufacturerModelName', 'ReferencedPerformedProcedureStepSequence1item(s)-', 'ReferencedSOPClassUID', 'ReferencedSOPInstanceUID', 'DerivationDescription', 'SourceImageSequence', 'ReferencedSOPClassUID', 'ReferencedSOPInstanceUID', 'SpatialLocationsPreserved', 'AnatomicRegionSequence', 'CodeValue', 'CodingSchemeDesignator', 'CodeMeaning', 'PatientName', 'PatientID', 'PatientBirthDate', 'PatientSex', 'PatientAge', 'Contrast/BolusAgent', 'BodyPartExamined', 'KVP', 'DeviceSerialNumber', 'SoftwareVersions', 'ProtocolName', 'DistanceSourcetoDetector', 'DistanceSourcetoPatient', 'EstimatedRadiographicMagnificatio', 'TableAngle', 'TableType', 'FieldofViewShape', 'FieldofViewDimension', 'ExposureTime', 'X-RayTubeCurrent', 'Exposure', 'ExposureinuAs', 'RectificationType', 'ImagerPixelSpacing', 'Grid', 'FocalSpot', 'AnodeTargetMaterial', 'BodyPartThickness', 'CompressionForce', 'AcquisitionDeviceProcessingDescription', 'AcquisitionDeviceProcessingCode', 'RelativeX-RayExposure', 'TomoLayerHeight', 'PositionerType', 'PositionerPrimaryAngle', 'PositionerSecondaryAngle', 'DetectorPrimaryAngle', 'DetectorSecondaryAngle', 'ShutterShape', 'ShutterLeftVerticalEdge', 'ShutterRightVerticalEdge', 'ShutterUpperHorizontalEdge', 'ShutterLowerHorizontalEdge', 'ViewPosition', 'DetectorConditionsNominalFlag', 'DetectorTemperature', 'DetectorType', 'DetectorConfiguration', 'DetectorDescription', 'DetectorMode', 'DetectorID', 'DateofLastDetectorCalibration', 'TimeofLastDetectorCalibration', 'ExposuresonDetectorSinceLastCa', 'ExposuresonDetectorSinceManufac', 'DetectorTimeSinceLastExposure', 'DetectorActiveTime', 'DetectorActivationOffsetFromExp', 'DetectorBinning', 'DetectorElementPhysicalSize', 'DetectorElementSpacing', 'DetectorActiveShape', 'DetectorActiveDimension', 'DetectorActiveOrigin', 'FieldofViewOrigin', 'FieldofViewRotation', 'FieldofViewHorizontalFlip', 'FilterMaterial', 'FilterThicknessMinimum', 'FilterThicknessMaximum', 'ExposureControlMode', 'ExposureControlModeDescription', 'ExposureStatus', 'ExposureTimeinuS', 'X-RayTubeCurrentinuA', 'PrivateCreator', 'Privatetagdata', 'StudyInstanceUID', 'SeriesInstanceUID', 'StudyID', 'SeriesNumber', 'AcquisitionNumber', 'InstanceNumber', 'PatientOrientation', 'FrameofReferenceUID', 'ImageLaterality', 'ImagesinAcquisition', 'PositionReferenceIndicator', 'ImageComments', 'SamplesperPixel', 'PhotometricInterpretation', 'Rows', 'Columns', 'BitsAllocated', 'BitsStored', 'HighBit', 'PixelRepresentation', 'PixelPaddingValue', 'QualityControlImage', 'BurnedInAnnotation', 'PixelIntensityRelationship', 'PixelIntensityRelationshipSign', 'WindowCenter', 'WindowWidth', 'RescaleIntercept', 'RescaleSlope', 'RescaleType', 'WindowCenter&WidthExplanation', 'BreastImplantPresent', 'PartialView', 'LossyImageCompression', 'PrivateCreator', 'CSAImageHeaderType', 'CSAImageHeaderVersion', 'CSAImageHeaderInfo', 'CSASeriesHeaderType', 'CSASeriesHeaderVersion', 'CSASeriesHeaderInfo', 'RequestedProcedureDescription', 'PerformedProcedureStepStartDate', 'PerformedProcedureStepStartTime', 'PerformedProcedureStepID', 'PerformedProcedureStepDescriptio', 'EntranceDose', 'DistanceSourcetoEntrance', 'OrganDose', 'OrganExposed', 'AcquisitionContextSequence', 'ReasonForPerformedProcedureCodeSequence', 'CodeValue', 'CodingSchemeDesignator', 'CodeMeaning', 'EntranceDoseinmGy', 'PrivateCreator', 'ReasonfortheRequestedProcedure', 'CalibrationImage', 'PrivateCreator', 'Privatetagdata', 'Privatetagdata', 'Privatetagdata', 'ViewCodeSequence', 'CodeValue', 'CodingSchemeDesignator', 'CodeMeaning', 'ViewModifierCodeSequence', 'PrivateCreator', 'ProjectionViewDisplayString', 'PresentationLUTShape')

    # ...
                
    dcm_files = [r"C:\Users\akhil\Downloads\CD no.2\CD no.2\MedVision\image\371203\1.3.12.2.1107.5.12.7.4405.30000013122104435475000000004\1.3.12.2.1107.5.12.7.4405.30000013122104435490600001421\img_1_1_1_1.dcm"]   

    for dcm_file in dcm_files:
        ds = pydicom.filereader.dcmread(dcm_file)
        workbook = xlsxwriter.Workbook(os.path.basename(dcm_file) + '.xlsx')
        worksheet = workbook.add_worksheet()

        row = 0
        col = 0

        for keyword in keywords:
            value = ds.get(keyword, "None")
            if isinstance(value, list):
                value = ", ".join([str(x) for x in value])
            elif isinstance(value, PersonName):
                value = str(value)
            worksheet.write(row, col, keyword)
            worksheet.write(row + 1, col, value)
            col += 1

    workbook.close()

这是来自 DICOM 标签的数据:

(0002, 0000) 文件元信息组长度 UL: 188

(0002, 0001) 文件元信息版本 OB: b'\x00\x01'

(0002, 0002) 媒体存储 SOP 类 UID UI:数字乳腺 X 射线图像存储 - 用于演示

(0002, 0003) 媒体存储 SOP 实例 UID UI:1.3.12.2.1107.5.12.7.4405.30000013122104435490600001313

(0002, 0010) 传输语法 UID UI:显式 VR Little Endian

(0002, 0012) 实现类 UID UI:1.2.40.0.13.1.1

(0002, 0013) 实施版本名称 SH: 'dcm4che-1.4.7'

【问题讨论】:

    标签: python excel pydicom


    【解决方案1】:

    文件元元素位于FileDataset.file_meta 属性中,因为它们不是严格意义上的SOP 实例的一部分,而是在写入DICOM File Format 时需要。

    >>> ds.file_meta.TransferSyntaxUID
    '1.2.840.10008.1.2.1'
    >>> ds.file_meta.get("TransferSyntaxUID")
    '1.2.840.10008.1.2.1'
    

    【讨论】:

      【解决方案2】:

      我建议你使用 dicom-csv python 包。它专门设计用于从存储在某些文件夹树中的 dicom 文件中收集所有可用的元数据(它使用 pydicom 来读取和操作 dicom 文件)。 https://pypi.org/project/dicom-csv/

      安装后 (pip install dicom-csv),您可以通过

      从某个文件夹的所有 dicom 图像中收集所有公共 dicom 标签
      from dicom_csv import join_tree
      
      df = join_tree('path/to/folder', relative=False, verbose=1)
      

      生成的 pandas.DataFrame 将包含不同的 DICOM 标记作为单独的列(pixel_array 数据除外),以及几个附加列,如 FileName、HasPixelArray。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-08
        • 1970-01-01
        • 2016-09-10
        相关资源
        最近更新 更多