{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"}],"dockerImageVersionId":30732,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport time\nimport matplotlib.pyplot as plt\nimport plotly.express as px\nimport seaborn as sns\nimport pydicom as dicom\nimport pydicom\nimport json\nimport glob\nimport collections\nimport cv2\nimport random\nfrom glob import glob\nimport nibabel as nib\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-06-21T02:12:11.122764Z","iopub.execute_input":"2024-06-21T02:12:11.123416Z","iopub.status.idle":"2024-06-21T02:12:14.639116Z","shell.execute_reply.started":"2024-06-21T02:12:11.123362Z","shell.execute_reply":"2024-06-21T02:12:14.637424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_coordinates_df = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_label_coordinates.csv')\ntrain_series = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_series_descriptions.csv')\ndf_train = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train.csv')\ndf_sub = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/sample_submission.csv')\ntest_series = pd.read_csv('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_series_descriptions.csv')","metadata":{"execution":{"iopub.status.busy":"2024-06-21T02:12:17.648198Z","iopub.execute_input":"2024-06-21T02:12:17.649106Z","iopub.status.idle":"2024-06-21T02:12:17.879170Z","shell.execute_reply.started":"2024-06-21T02:12:17.649057Z","shell.execute_reply":"2024-06-21T02:12:17.877440Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_coordinates_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-06-21T02:12:32.039160Z","iopub.execute_input":"2024-06-21T02:12:32.039890Z","iopub.status.idle":"2024-06-21T02:12:32.069906Z","shell.execute_reply.started":"2024-06-21T02:12:32.039838Z","shell.execute_reply":"2024-06-21T02:12:32.068362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_series.head()","metadata":{"execution":{"iopub.status.busy":"2024-06-21T02:13:38.342229Z","iopub.execute_input":"2024-06-21T02:13:38.342719Z","iopub.status.idle":"2024-06-21T02:13:38.355683Z","shell.execute_reply.started":"2024-06-21T02:13:38.342683Z","shell.execute_reply":"2024-06-21T02:13:38.354054Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_series)","metadata":{"execution":{"iopub.status.busy":"2024-06-21T03:41:40.217089Z","iopub.execute_input":"2024-06-21T03:41:40.217536Z","iopub.status.idle":"2024-06-21T03:41:40.227224Z","shell.execute_reply.started":"2024-06-21T03:41:40.217502Z","shell.execute_reply":"2024-06-21T03:41:40.225436Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.head()","metadata":{"execution":{"iopub.status.busy":"2024-06-21T02:14:15.714324Z","iopub.execute_input":"2024-06-21T02:14:15.714824Z","iopub.status.idle":"2024-06-21T02:14:15.753748Z","shell.execute_reply.started":"2024-06-21T02:14:15.714786Z","shell.execute_reply":"2024-06-21T02:14:15.752362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"target_columns = df_train.columns[1:]\ncolumns_to_idx = {v:i for i, v in enumerate(target_columns)}\nconditions = ['Spinal Canal Stenosis',\n              'Left Neural Foraminal Narrowing',\n              'Right Neural Foraminal Narrowing',\n              'Left Subarticular Stenosis',\n              'Right Subarticular Stenosis']\n\ncond_to_column = {\n    'Spinal Canal Stenosis': 'spinal_canal_stenosis',\n    'Left Neural Foraminal Narrowing': 'left_neural_foraminal_narrowing',\n    'Right Neural Foraminal Narrowing': 'right_neural_foraminal_narrowing',\n    'Left Subarticular Stenosis': 'left_subarticular_stenosis',\n    'Right Subarticular Stenosis': 'right_subarticular_stenosis'\n}\nlevel_to_column = {\n    'L1/L2': 'l1_l2',\n    'L2/L3': 'l2_l3',\n    'L3/L4': 'l3_l4',\n    'L4/L5': 'l4_l5',\n    'L5/S1': 'l5_s1',\n}\ndef cond_level_to_column_key_idx(cond, level):\n    key = '{}_{}'.format(cond_to_column[cond],\n                        level_to_column[level])\n    return columns_to_idx[key]\n\nname_to_label = {\n    'Normal/Mild': 0,\n    'Moderate': 1,\n    'Severe': 2\n}","metadata":{"execution":{"iopub.status.busy":"2024-06-21T02:14:42.243522Z","iopub.execute_input":"2024-06-21T02:14:42.244052Z","iopub.status.idle":"2024-06-21T02:14:42.259170Z","shell.execute_reply.started":"2024-06-21T02:14:42.244012Z","shell.execute_reply":"2024-06-21T02:14:42.256583Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## \"Sagittal T2/STIR\", \"Sagittal T1\", \"Axial T2\"\n这三者是医学成像术语，特别常见于磁共振成像（MRI）。\n\n1. \"Sagittal T2/STIR\"：\n   Sagittal 指的是扫描的方向，是沿人体站立状态时的前后方向进行切片扫描。\n   T2 表示使用T2加权的图像，这种图像强调了体内不同组织间的水分差别，比如可以清楚看到脑脊液（CSF）是高信号（白色）。STIR (Short TI Inversion Recovery) 是一种特殊的 T2 序列，它可以抑制（变黑）脂肪信号，使得有水分的组织更明显。\n\n2. \"Sagittal T1\"： \n   与 \"Sagittal T2/STIR\" 类似，Sagittal 同样表示沿人体站立状态的前后方向进行的扫描。T1 是另一种加权序列，T1加权图像能够明显区分软组织的细微差别，比如区分灰质和白质。\n\n3. \"Axial T2\"：\n   Axial 是指沿人体的横向进行切片扫描（即在人体水平面，头脚方向切割），这可以看到身体的\"横断面\"。同样，T2 的加权使得体内不同组织间的水分差别显现出来。\n\n总的来说，这三个术语解释了 MRI 图像采集的角度（Sagittal 或 Axial）和采集设定（T1，T2 或 T2/STIR 加权），这些设定决定了图像上不同组织的显示方式和显示效果。医生可以根据不同疾病和症状选择最适当的设定进行扫描。","metadata":{}},{"cell_type":"markdown","source":"## Spinal Canal Stenosis\n\n- 脊椎管狭窄（Spinal Canal Stenosis）是指脊椎管（脊髓和神经根经过的管道）内部变窄，可能压迫到脊髓或神经根，症状可能包括背痛，腿痛，甚至肌力减弱和感觉丧失等。\n\n- 对于脊椎管狭窄的检测，常常利用 Sagittal (矢状面) T2/STIR 加权的 MRI 序列。原因如下：\n\n1. 脊椎管狭窄的主要表现是脊髓被压迫，这种压迫会导致脊髓周围的脑脊液相对减少。T2 加权的图像能够清晰的显示脑脊液（在 T2 加权图像上显示为高信号，呈现白色）。\n\n2. STIR （Short TI Inversion Recovery）序列有抑制脂肪的作用，使得有水分的组织更明显。这样使得脊髓、椎间盘和其它结构更清晰。对于查看脊椎管狭窄这种需要关注多种不同结构之间关系的病症，这种序列非常有帮助。\n\n3. 在 Sagittal（矢状面）视角下，可以清晰地看到脊髓在脊椎管中的位置以及其周围结构，检查是否有骨质增生、椎间盘突出、韧带增厚等现象导致脊椎管变窄。\n\n- 所以，Sagittal T2/STIR MRI 序列变得非常理想，使之成为评估脊椎管狭窄的首选成像方法。然而，在某些情况下，可能还需要使用其他类型的序列和角度，以获取更准确的信息。\n","metadata":{}},{"cell_type":"markdown","source":"## Neural Foraminal Narrowin\n- 神经根管 Narrowing 或神经孔狭窄是指脊柱旁的神经出口处达到或超过50%的狭窄。这种情况常常是由骨质增生、椎间盘突出，或是椎体滑脱等原因引起的。\n\n- 在检测神经孔狭窄时，医生通常会选择使用 MRI 的 T1 加权序列。因为相较于其他序列，T1 加权序列提供了对软组织的优良对比度，从而帮助医生更好地区分椎间盘、脊髓和神经根等组织结构。\n\n- 采用具有 Sagittal 视角的 T1 加权序列扫描能够使得医生获取病人脊脊柱全长的连续视图，从而可以评估整个脊柱的各个部位是否存在神经孔狭窄，包括检查并发的病变，例如椎间盘疾病、脊柱滑脱或骨质增生等等。","metadata":{}},{"cell_type":"markdown","source":"## Subarticular Stenosis\n- 关节下狭窄（Subarticular Stenosis），也被称为侧突间狭窄，是由脊椎椎弓根和关节突之间的区域变窄导致的。它可能压迫脊神经引起疼痛，甚至影响肌肉力量和脚部感觉。\n\n- 这种狭窄主要涉及关节突和椎弓根之间的区域，因此，使用能够显式显示这些结构的轴向（Axial）T2加权的MRI扫描能够提供最优的图像。理由如下： \n\n1. 轴向图像能够最好地表示出横截面视图，这可以清楚的显示出这些结构之间的空间关系，比如：骨质增生、软组织肿胀或椎间盘突出等情况。\n\n2. T2加权的图像能够提供优秀的软组织对比度，并且在图像中尤其突显出含有高水分的组织，诸如：椎间盘和脑脊液等。脊椎侧突间狭窄可能导致脑脊液空间减少，这会在T2加权图像上以低信号（暗色）表现出来。\n\n- 因此，Axial T2 MRI扫描是评估关节下狭窄的首选成像方法，尤其是在视觉化上存在狭窄的脊柱水平以及周围相关结构时。当然，结合其他视角和加权的扫描结合使用将有助于对病情的全面评估和诊断。","metadata":{}},{"cell_type":"code","source":"train_series[train_series['study_id']==4096820034]","metadata":{"execution":{"iopub.status.busy":"2024-06-21T02:22:06.831797Z","iopub.execute_input":"2024-06-21T02:22:06.833206Z","iopub.status.idle":"2024-06-21T02:22:06.849103Z","shell.execute_reply.started":"2024-06-21T02:22:06.833158Z","shell.execute_reply":"2024-06-21T02:22:06.847827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def extract_info(study_id):\n    study_meta = df_train[df_train['study_id'] == study_id]\n    study_coordinates = label_coordinates_df[\n        label_coordinates_df['study_id']== study_id]\n    study_series = train_series[train_series['study_id']==study_id]\n    series_ids = study_coordinates['series_id'].unique().tolist()\n    \n    print(series_ids)\n    #assert len(series_ids) <=5\n    assert len(study_coordinates) == 25, print(study_id)\n    series_description_dict = {}\n    for sid, des in zip(study_series['series_id'], study_series['series_description']):\n        series_description_dict[sid] = des\n    conditions_sids = []\n    cond_to_sid = {}\n    for cond in conditions:\n        ids= study_coordinates[\n            study_coordinates['condition'] == cond\n        ].series_id.unique().tolist()\n        #assert len(ids)==1\n        \n        #sid = ids[0]\n        conditions_sids.append(ids)\n        cond_to_sid[cond] = ids\n\n    print(series_description_dict)\n    #print(conditions_sids)\n    infos = {}\n    infos['study_id'] = study_id\n    infos['sids'] = series_ids\n    infos['labeled_sids'] = conditions_sids\n    infos['cond_to_sid'] = cond_to_sid\n    target_values = study_meta[target_columns].values[0]\n    infos['target'] = [ name_to_label[name] for name in target_values]\n    infos['target_str'] = [ name for name in target_values]\n    aux_infos = {}\n    for cond in conditions:\n        c = study_coordinates[\n            study_coordinates['condition'] == cond\n        ]\n        coord_info = []\n        for _, row in c.iterrows():\n            coord_info.append(dict(row))\n        coord_info = sorted(coord_info, \n                            key=lambda k: int(k['level'].split('/')[0][1:]))\n\n        aux_infos[cond] = coord_info\n        \n    infos['aux_infos'] = aux_infos\n    return infos\n\n","metadata":{"execution":{"iopub.status.busy":"2024-06-21T02:33:17.149363Z","iopub.execute_input":"2024-06-21T02:33:17.149902Z","iopub.status.idle":"2024-06-21T02:33:17.165933Z","shell.execute_reply.started":"2024-06-21T02:33:17.149862Z","shell.execute_reply":"2024-06-21T02:33:17.164169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"study_id = 4096820034\ninfo = extract_info(study_id)\ninfo","metadata":{"execution":{"iopub.status.busy":"2024-06-21T02:33:20.778136Z","iopub.execute_input":"2024-06-21T02:33:20.778593Z","iopub.status.idle":"2024-06-21T02:33:20.814359Z","shell.execute_reply.started":"2024-06-21T02:33:20.778559Z","shell.execute_reply":"2024-06-21T02:33:20.812667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_dir = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/train_images'\ndef draw_by_info(info, cond='Spinal Canal Stenosis'):\n    sub_dir = f\"{img_dir}/{info['study_id']}\"\n    sub_aux_info = info['aux_infos'][cond]\n    target = info['target_str']\n    print('cond: ', cond)\n    print('labeled samples: ', len(sub_aux_info))\n    \n    for a in sub_aux_info:\n        dicom_fn = f\"{sub_dir}/{a['series_id']}/{a['instance_number']}.dcm\"\n        label = target[cond_level_to_column_key_idx(\n            cond, a['level']\n        )]\n        dicom_data = pydicom.dcmread(dicom_fn)\n        image = dicom_data.pixel_array\n        plt.imshow(image, cmap='gray')\n        plt.plot(a['x'], a['y'], 'ro', markersize=5) \n        plt.axis('off')\n        plt.text(0, 0, f\"Level: {a['level']}, Label: {label}, {a['series_id']}\", \n                 color='red', size='medium', backgroundcolor='white')\n        plt.show()\n\ndraw_by_info(info)","metadata":{"execution":{"iopub.status.busy":"2024-06-21T02:43:12.442587Z","iopub.execute_input":"2024-06-21T02:43:12.443375Z","iopub.status.idle":"2024-06-21T02:43:13.519566Z","shell.execute_reply.started":"2024-06-21T02:43:12.443313Z","shell.execute_reply":"2024-06-21T02:43:13.515544Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"draw_by_info(info, conditions[1])","metadata":{"execution":{"iopub.status.busy":"2024-06-21T02:43:20.597698Z","iopub.execute_input":"2024-06-21T02:43:20.599133Z","iopub.status.idle":"2024-06-21T02:43:21.609305Z","shell.execute_reply.started":"2024-06-21T02:43:20.599066Z","shell.execute_reply":"2024-06-21T02:43:21.607988Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"draw_by_info(info, conditions[2])","metadata":{"execution":{"iopub.status.busy":"2024-06-21T02:43:27.098076Z","iopub.execute_input":"2024-06-21T02:43:27.098473Z","iopub.status.idle":"2024-06-21T02:43:28.130492Z","shell.execute_reply.started":"2024-06-21T02:43:27.098439Z","shell.execute_reply":"2024-06-21T02:43:28.129106Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"draw_by_info(info, conditions[3])","metadata":{"execution":{"iopub.status.busy":"2024-06-21T02:43:47.793715Z","iopub.execute_input":"2024-06-21T02:43:47.794201Z","iopub.status.idle":"2024-06-21T02:43:48.837857Z","shell.execute_reply.started":"2024-06-21T02:43:47.794167Z","shell.execute_reply":"2024-06-21T02:43:48.836714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"draw_by_info(info, conditions[4])","metadata":{"execution":{"iopub.status.busy":"2024-06-21T02:47:00.904472Z","iopub.execute_input":"2024-06-21T02:47:00.904977Z","iopub.status.idle":"2024-06-21T02:47:02.151213Z","shell.execute_reply.started":"2024-06-21T02:47:00.904941Z","shell.execute_reply":"2024-06-21T02:47:02.149344Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# DICOM Property\n","metadata":{}},{"cell_type":"markdown","source":"pydicom.dataset.FileDataset是pydicom库的一个主要类，它用于存储和操作DICOM格式的医学图像数据。以下是一些常用的FileDataset对象的属性（这将取决于特定DICOM文件中包含的元素）：\n\n- BitsAllocated：为图像分配的位数，这个例子里传感器为16位。\n\n- BitsStored：实际用于存储图像信息的位数，这个例子里传感器为12位。\n\n- **Columns**：图像的宽度，即列数。\n\n- ContentDate和ContentTime：图像生成的日期和时间。\n\n- FrameOfReferenceUID：帧参考UID是一个唯一标识符，表示一个图像的坐标系统和方向。\n\n- HighBit：存储在位平面中的最高位数，在此为11。\n\n- ImageOrientationPatient：表示图像中像素数据的空间方向。\n\n- **ImagePositionPatient**：表示第一行和列的物理位置。\n\n- InstanceNumber：序列中的特定图像的顺序编号。\n\n- PatientID：唯一标识一个患者的ID。\n\n- **PatientPosition**：图像获取时患者的物理方向，HFS代表 head first supine 或者说头部朝前仰卧位置。\n\n- **PhotometricInterpretation**：显示图像所需的像素色彩， MONOCHROME2表明这是一张灰度图。\n\n- PixelRepresentation：像素值的表示方式。0表示无符号整数，1表示有符号整数。\n\n- **PixelSpacing**：物理距离（毫米）。\n\n- **RescaleIntercept和RescaleSlope**：这些参数用于校正和显示图像。\n\n- **Rows**：图像的高度，即行数。\n\n- SOPInstanceUID：标准化对象的唯一标识符。\n\n- **SamplesPerPixel**：每个像素的样本数。\n\n- SeriesDescription：序列的描述。\n\n- SeriesInstanceUID：标识图像的序列。\n\n- **SliceLocation**：表示图像切片在患者体内的物理位置。\n\n- **SliceThickness**：切片的厚度。\n\n- **SpacingBetweenSlices**：切片之间的距离。\n\n- StudyInstanceUID：研究实例的唯一标识符。\n\n- **WindowCenter和WindowWidth**：这两个参数用于设置图像的灰度级别和对比度。","metadata":{}},{"cell_type":"markdown","source":"ImagePositionPatient: [-0.353442, -54.1397, 155.921]\n\nImagePositionPatient 是 DICOM 文件标准中的一个标签，用于指定图像在患者体内的空间位置。它是一个由三个数值组成的数组，表示的是图像平面左上角像素（也就是（0,0）位置的像素）在三维空间中的位置。\n\n具体来说，这三个数值分别对应于 X,Y,Z 坐标系上的位置：\n\n- 第一个数值 (-0.353442) 是患者左右方向上的位置，左侧为正，右侧为负。\n- 第二个数值 (-54.1397) 是患者前后方向上的位置，前侧为正，后侧为负。\n- 第三个数值 (155.921) 是患者上下方向上的位置，头部为正，脚部为负。","metadata":{}},{"cell_type":"code","source":"fns = glob(img_dir+'/*/*/*.dcm')\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tqdm\nproperties = ['ImageOrientationPatient', \n 'ImagePositionPatient',\n 'InstanceNumber', \n 'PatientID', \n 'PatientPosition',\n 'PhotometricInterpretation',\n 'PixelSpacing', \n 'Rows', \n #'Cols',\n 'SliceThickness',\n 'SpacingBetweenSlices', \n 'StudyInstanceUID',\n 'WindowCenter',\n 'WindowWidth']\n\ndef get_dicom_meta_info(fns):\n    print(len(fns))\n    meta_infos = {\n        'study_id': [],\n        'series_id': [],\n        'instance_number': []\n    }\n    for fn in tqdm.tqdm(fns[:10000]):\n        #print(fn)\n        dicom = pydicom.dcmread(fn)\n        #properties = dicom.dir()\n        #print(properties)\n        ss = fn.split('/')\n        study_id = ss[-3]\n        sid = ss[-2]\n        instance_number = ss[-1].split('.')[0]\n        for p in properties:\n            #print(p)\n            if p == 'PixelData':\n                continue\n            a = getattr(dicom, p)\n            if p not in meta_infos.keys():\n                meta_infos[p] = [a]\n            else:\n                meta_infos[p].append(a)\n        meta_infos['study_id'].append(study_id)\n        meta_infos['series_id'].append(sid)\n        meta_infos['instance_number'].append(instance_number)\n            \n        #break\n    return meta_infos\n    #return pd.DataFrame.from_dict(meta_infos)\n        \ndicom_meta = get_dicom_meta_info(fns)","metadata":{"execution":{"iopub.status.busy":"2024-06-21T03:07:13.160587Z","iopub.execute_input":"2024-06-21T03:07:13.161081Z","iopub.status.idle":"2024-06-21T03:08:42.362836Z","shell.execute_reply.started":"2024-06-21T03:07:13.161046Z","shell.execute_reply":"2024-06-21T03:08:42.361326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dicom_meta_df = pd.DataFrame.from_dict(dicom_meta)","metadata":{"execution":{"iopub.status.busy":"2024-06-21T03:08:47.971756Z","iopub.execute_input":"2024-06-21T03:08:47.972944Z","iopub.status.idle":"2024-06-21T03:08:48.156080Z","shell.execute_reply.started":"2024-06-21T03:08:47.972887Z","shell.execute_reply":"2024-06-21T03:08:48.154852Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" def query_PixelSpacing(row):\n     \n    return row['PixelSpacing'][0], row['PixelSpacing'][1]\n\ndicom_meta_df['PixelSpacing0'], dicom_meta_df['PixelSpacing1'] = zip(*dicom_meta_df.apply(query_PixelSpacing, axis=1))\n","metadata":{"execution":{"iopub.status.busy":"2024-06-21T03:08:51.192753Z","iopub.execute_input":"2024-06-21T03:08:51.194024Z","iopub.status.idle":"2024-06-21T03:08:51.424716Z","shell.execute_reply.started":"2024-06-21T03:08:51.193980Z","shell.execute_reply":"2024-06-21T03:08:51.423481Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dicom_meta_df.iloc[1]","metadata":{"execution":{"iopub.status.busy":"2024-06-21T03:08:53.629884Z","iopub.execute_input":"2024-06-21T03:08:53.630356Z","iopub.status.idle":"2024-06-21T03:08:53.641309Z","shell.execute_reply.started":"2024-06-21T03:08:53.630322Z","shell.execute_reply":"2024-06-21T03:08:53.639895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dicom_meta_df['SliceThickness'].unique()","metadata":{"execution":{"iopub.status.busy":"2024-06-21T03:08:58.180503Z","iopub.execute_input":"2024-06-21T03:08:58.181154Z","iopub.status.idle":"2024-06-21T03:08:58.191715Z","shell.execute_reply.started":"2024-06-21T03:08:58.181104Z","shell.execute_reply":"2024-06-21T03:08:58.190467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dicom_meta_df['SpacingBetweenSlices'].unique()","metadata":{"execution":{"iopub.status.busy":"2024-06-21T03:09:00.879338Z","iopub.execute_input":"2024-06-21T03:09:00.879796Z","iopub.status.idle":"2024-06-21T03:09:00.888858Z","shell.execute_reply.started":"2024-06-21T03:09:00.879762Z","shell.execute_reply":"2024-06-21T03:09:00.887657Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dicom_meta_df['PixelSpacing0'].unique()","metadata":{"execution":{"iopub.status.busy":"2024-06-21T03:09:06.898802Z","iopub.execute_input":"2024-06-21T03:09:06.899282Z","iopub.status.idle":"2024-06-21T03:09:06.909465Z","shell.execute_reply.started":"2024-06-21T03:09:06.899248Z","shell.execute_reply":"2024-06-21T03:09:06.908059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dicom_meta_df['PixelSpacing1'].unique()","metadata":{"execution":{"iopub.status.busy":"2024-06-21T03:09:11.252357Z","iopub.execute_input":"2024-06-21T03:09:11.252886Z","iopub.status.idle":"2024-06-21T03:09:11.262516Z","shell.execute_reply.started":"2024-06-21T03:09:11.252850Z","shell.execute_reply":"2024-06-21T03:09:11.261085Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}