{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## Imports","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"code","source":"!pip install -U pip\n!pip install pillow pylibjpeg[all] python-gdcm\n!pip install dicomsdl","metadata":{"execution":{"iopub.status.busy":"2023-03-07T09:20:51.411905Z","iopub.execute_input":"2023-03-07T09:20:51.412525Z","iopub.status.idle":"2023-03-07T09:21:47.889501Z","shell.execute_reply.started":"2023-03-07T09:20:51.412392Z","shell.execute_reply":"2023-03-07T09:21:47.88817Z"},"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport pickle\nimport gc\nimport glob\nfrom pathlib import Path\n\nimport shutil\nfrom joblib import Parallel, delayed\nimport cv2\nfrom tqdm.auto import tqdm\nimport numpy as np\nimport pandas as pd\nimport torch\nimport pydicom\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\n%matplotlib inline\nimport matplotlib.pyplot as plt\nprint('pydicom version:', pydicom.__version__)\nimport dicomsdl","metadata":{"execution":{"iopub.status.busy":"2023-03-07T09:21:47.891469Z","iopub.execute_input":"2023-03-07T09:21:47.891851Z","iopub.status.idle":"2023-03-07T09:21:50.289158Z","shell.execute_reply.started":"2023-03-07T09:21:47.891813Z","shell.execute_reply":"2023-03-07T09:21:50.287624Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load Data","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/rsna-breast-cancer-detection/train.csv')\ndisplay(train_df.head())\ndisplay(train_df.shape)\ntest_df = pd.read_csv('/kaggle/input/rsna-breast-cancer-detection/test.csv')\ndisplay(test_df.head())\ndisplay(test_df.shape)","metadata":{"execution":{"iopub.status.busy":"2023-03-07T09:21:50.290686Z","iopub.execute_input":"2023-03-07T09:21:50.291397Z","iopub.status.idle":"2023-03-07T09:21:50.483382Z","shell.execute_reply.started":"2023-03-07T09:21:50.291349Z","shell.execute_reply":"2023-03-07T09:21:50.481926Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Helpers","metadata":{}},{"cell_type":"code","source":"def get_widowing_stat(patient_id, img_id, voi_lut = False, fix_monochrome = True):\n    path = f\"/kaggle/input/rsna-breast-cancer-detection/train_images/{patient_id}/{img_id}.dcm\"\n    dicom = dicomsdl.open(path)\n    data = dicom.pixelData()\n    data = data[5:-5, 5:-5]\n    \n    rev = 0\n    rev_val = np.amax(data)\n    if fix_monochrome and dicom.getPixelDataInfo()['PhotometricInterpretation'] == \"MONOCHROME1\":\n        rev = 1\n        data = np.amax(data) - data\n        \n    if type(dicom.WindowWidth) == list:\n        center = dicom.WindowCenter[0]\n        width = dicom.WindowWidth[0]\n    else:\n        center = dicom.WindowCenter\n        width = dicom.WindowWidth\n    y_range = 2**dicom.BitsStored - 1\n    \n    return data.min(), data.max(), center, width, y_range, rev, rev_val","metadata":{"execution":{"iopub.status.busy":"2023-02-24T07:13:07.759787Z","iopub.execute_input":"2023-02-24T07:13:07.760356Z","iopub.status.idle":"2023-02-24T07:13:07.769761Z","shell.execute_reply.started":"2023-02-24T07:13:07.760309Z","shell.execute_reply":"2023-02-24T07:13:07.768725Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"results = Parallel(n_jobs=4)(\n    delayed(get_widowing_stat)(patient_id, img_id)\n    for patient_id, img_id in tqdm(zip(train_df['patient_id'].values, train_df['image_id'].values), total=len(train_df))\n)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"results = pd.DataFrame(results,\n                      columns = ['min', 'max', 'center', 'width', 'y_range', 'rev', 'rev_max'])\ntrain_df = pd.concat([train_df, results], axis=1)\ntrain_df.to_csv('windowing_stat.csv', index=False)","metadata":{},"execution_count":null,"outputs":[]}]}