{"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":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport os\nfrom tqdm import tqdm\nimport pydicom\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-11-03T20:14:18.303754Z","iopub.execute_input":"2022-11-03T20:14:18.304266Z","iopub.status.idle":"2022-11-03T20:14:19.081796Z","shell.execute_reply.started":"2022-11-03T20:14:18.304164Z","shell.execute_reply":"2022-11-03T20:14:19.080576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### References\n* https://www.kaggle.com/code/reppic/gradient-sigmoid-windowing/notebook\n* https://www.kaggle.com/code/omission/eda-view-dicom-images-with-correct-windowing/notebook\n* https://www.kaggle.com/code/dcstang/see-like-a-radiologist-with-systematic-windowing/notebook\n* https://radiopaedia.org/articles/ct-head-an-approach?lang=gb","metadata":{}},{"cell_type":"markdown","source":"## NOTE\n### CT image values correspond to Hounsfield units (HU). But the values stored in CT Dicoms are not Hounsfield units, but instead a scaled version. To extract the Hounsfield units we need to apply a linear transformation, which can be deduced from the Dicom tags.\n\n### Once we have transformed the pixel values to Hounsfield units, we can apply a windowing: the usual values for a head CT are a center of 40 and a width of 80, but we can also extract this from the Dicom headers.","metadata":{}},{"cell_type":"code","source":"TRAIN_IMG_PATH = \"../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/stage_2_train\"\nTEST_IMG_PATH = \"../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/stage_2_test\"\nBASE_PATH = \"../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection\"","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:14:20.085975Z","iopub.execute_input":"2022-11-03T20:14:20.086427Z","iopub.status.idle":"2022-11-03T20:14:20.092002Z","shell.execute_reply.started":"2022-11-03T20:14:20.086387Z","shell.execute_reply":"2022-11-03T20:14:20.091073Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(\"../input/rsna-intracranial-hemorrhage-detection/rsna-intracranial-hemorrhage-detection/stage_2_train.csv\")\ntrain.head()","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:14:20.875508Z","iopub.execute_input":"2022-11-03T20:14:20.87627Z","iopub.status.idle":"2022-11-03T20:14:27.482902Z","shell.execute_reply.started":"2022-11-03T20:14:20.876233Z","shell.execute_reply":"2022-11-03T20:14:27.481728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['filename'] = train['ID'].apply(lambda st: \"ID_\" + st.split('_')[1] + \".dcm\")\ntrain['type'] = train['ID'].apply(lambda st: st.split('_')[2])\ntrain = train[['Label', 'filename', 'type']].drop_duplicates().pivot(index='filename', columns='type', values='Label').reset_index()","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:14:30.042823Z","iopub.execute_input":"2022-11-03T20:14:30.043386Z","iopub.status.idle":"2022-11-03T20:14:44.431668Z","shell.execute_reply.started":"2022-11-03T20:14:30.043335Z","shell.execute_reply":"2022-11-03T20:14:44.430373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:14:44.433477Z","iopub.execute_input":"2022-11-03T20:14:44.434063Z","iopub.status.idle":"2022-11-03T20:14:44.446768Z","shell.execute_reply.started":"2022-11-03T20:14:44.434022Z","shell.execute_reply":"2022-11-03T20:14:44.445549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_epidural = train[(train['epidural'] == 1) & (train['intraparenchymal'] == 0) & (train['intraventricular'] == 0) & (train['subarachnoid'] == 0) & (train['subdural'] == 0)][\"filename\"][:1000]\ntrain_intraparenchymal = train[(train['epidural'] == 0) & (train['intraparenchymal'] == 1) & (train['intraventricular'] == 0) & (train['subarachnoid'] == 0) & (train['subdural'] == 0)][\"filename\"][:1000]\ntrain_intraventricular = train[(train['epidural'] == 0) & (train['intraparenchymal'] == 0) & (train['intraventricular'] == 1) & (train['subarachnoid'] == 0) & (train['subdural'] == 0)][\"filename\"][:1000]\ntrain_subarachnoid = train[(train['epidural'] == 0) & (train['intraparenchymal'] == 0) & (train['intraventricular'] == 0) & (train['subarachnoid'] == 1) & (train['subdural'] == 0)][\"filename\"][:1000]\ntrain_subdural = train[(train['epidural'] == 0) & (train['intraparenchymal'] == 0) & (train['intraventricular'] == 0) & (train['subarachnoid'] == 0) & (train['subdural'] == 1)][\"filename\"][:500]\ntrain_any0 = train[train['any'] == 0][\"filename\"][:1000]","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:14:46.121279Z","iopub.execute_input":"2022-11-03T20:14:46.121769Z","iopub.status.idle":"2022-11-03T20:14:46.256967Z","shell.execute_reply.started":"2022-11-03T20:14:46.121733Z","shell.execute_reply":"2022-11-03T20:14:46.255776Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"train_epidural length -> \",len(train_epidural))\nprint(\"train_intraparenchymal length -> \",len(train_intraparenchymal))\nprint(\"train_intraventricular length -> \",len(train_intraventricular))\nprint(\"train_subarachnoid length -> \",len(train_subarachnoid))\nprint(\"train_subdural length -> \",len(train_subdural))\nprint(\"train_any0 length -> \",len(train_any0))","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:14:48.75991Z","iopub.execute_input":"2022-11-03T20:14:48.760619Z","iopub.status.idle":"2022-11-03T20:14:48.768905Z","shell.execute_reply.started":"2022-11-03T20:14:48.760583Z","shell.execute_reply":"2022-11-03T20:14:48.767379Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train[train[\"filename\"] == train_epidural[164]]","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:17:49.836479Z","iopub.execute_input":"2022-11-03T20:17:49.836983Z","iopub.status.idle":"2022-11-03T20:17:50.020871Z","shell.execute_reply.started":"2022-11-03T20:17:49.836942Z","shell.execute_reply":"2022-11-03T20:17:50.019726Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_epidural[164]","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:17:18.858132Z","iopub.execute_input":"2022-11-03T20:17:18.858548Z","iopub.status.idle":"2022-11-03T20:17:18.865828Z","shell.execute_reply.started":"2022-11-03T20:17:18.858503Z","shell.execute_reply":"2022-11-03T20:17:18.86465Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"hem_types = ['epidural', 'intraparenchymal', 'intraventricular', 'subarachnoid', 'subdural']","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:18:20.670913Z","iopub.execute_input":"2022-11-03T20:18:20.671399Z","iopub.status.idle":"2022-11-03T20:18:20.677285Z","shell.execute_reply.started":"2022-11-03T20:18:20.671359Z","shell.execute_reply":"2022-11-03T20:18:20.675978Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_random_images():\n    \"\"\"\n        Bu fonksiyon her bir kanama türünden 1 er örnek ve herhangi bir kanama türü görülmeyen hastalardan rastgele 5 örnek alır.\n        Bu örnekleri pydicom_read_file() metodu ile okuyarak geri döndürür.\n    \"\"\"\n    image_names = [list(train[train[h_type] == 1].sample(1)['filename'])[0] for h_type in hem_types] # Her bir kanama türünden 1 er örnek alındı\n    image_names += list(train[train['any'] == 0].sample(5)['filename']) # Herhangi bir kanama türü görülmeyen hastalardan 5 örnek alındı\n    print(image_names)\n    return [pydicom.read_file(os.path.join(TRAIN_IMG_PATH, img_name)) for img_name in image_names]","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:18:20.815874Z","iopub.execute_input":"2022-11-03T20:18:20.816282Z","iopub.status.idle":"2022-11-03T20:18:20.824206Z","shell.execute_reply.started":"2022-11-03T20:18:20.816247Z","shell.execute_reply":"2022-11-03T20:18:20.822787Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images = load_random_images()","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:18:20.953012Z","iopub.execute_input":"2022-11-03T20:18:20.953409Z","iopub.status.idle":"2022-11-03T20:18:21.347907Z","shell.execute_reply.started":"2022-11-03T20:18:20.953377Z","shell.execute_reply":"2022-11-03T20:18:21.346993Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = images[0]\nimg","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:18:21.349715Z","iopub.execute_input":"2022-11-03T20:18:21.350012Z","iopub.status.idle":"2022-11-03T20:18:21.357779Z","shell.execute_reply.started":"2022-11-03T20:18:21.349984Z","shell.execute_reply":"2022-11-03T20:18:21.356696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Normal Windowing","metadata":{}},{"cell_type":"code","source":"def view_images(images):\n    \"\"\"\n        Bu fonkisyon alınan 10 adet görseli çıktı olarak görselleştirir.\n        Oluşturulan subplot 5 sütun ve 2 satırdan oluşur.\n    \"\"\"\n    width = 5\n    height = 2\n    fig, axs = plt.subplots(height, width, figsize=(15,5))\n    \n    for im in range(0, height * width):\n        image = images[im]\n        i = im // width # Bu 2 satır matplotlib fonksiyonu için hazırlanmıştır. Fonksiyon içeriğindeki satır ve sütunların girdisi [0,0],[0,1],[0,2] ...... [1,4] şeklinde tanımlanmıştır\n        j = im % width\n        axs[i,j].imshow(image, cmap=plt.cm.bone) # matplotlib ile görselleştirme yapılmış\n        axs[i,j].axis('off') # grafik üzerindeki akslar kapatılmış\n        title = hem_types[im] if im < len(hem_types) else 'normal' # kanama türüne göre başlık eklenmiştir.\n        axs[i,j].set_title(title)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:18:21.365748Z","iopub.execute_input":"2022-11-03T20:18:21.366065Z","iopub.status.idle":"2022-11-03T20:18:21.374155Z","shell.execute_reply.started":"2022-11-03T20:18:21.366037Z","shell.execute_reply":"2022-11-03T20:18:21.372884Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images_pixel_array = [img.pixel_array for img in images] # Yüklenen her bir dicom file pixelleri diziye atandı\nprint(\"Dicom dosyası pixel_array matrix boyutu: \", images_pixel_array[0].shape)\nview_images(images_pixel_array)","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:18:21.508411Z","iopub.execute_input":"2022-11-03T20:18:21.50965Z","iopub.status.idle":"2022-11-03T20:18:22.326424Z","shell.execute_reply.started":"2022-11-03T20:18:21.509607Z","shell.execute_reply":"2022-11-03T20:18:22.32513Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Brain Windowing","metadata":{}},{"cell_type":"code","source":"def get_first_of_dicom_field_as_int(x,data):\n    #get x[0] as in int is x is a 'pydicom.multival.MultiValue', otherwise get int(x)\n    if type(x) == pydicom.multival.MultiValue:\n        print(data[('0008','0018')].value, \"-> \",int(x[0]))\n        return int(x[0])\n    else:\n        print(data[('0008','0018')].value, \"-> \",int(x))\n        return int(x)\n    \ndef get_windowing(data):\n    dicom_fields = [data[('0028','1050')].value, #window center\n                    data[('0028','1051')].value, #window width\n                    data[('0028','1052')].value, #intercept\n                    data[('0028','1053')].value] #slope\n    #print(dicom_fields)\n    print(\"Patient ID: \", data[('0008','0018')].value)\n    return [get_first_of_dicom_field_as_int(x,data) for x in dicom_fields]","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:18:22.328416Z","iopub.execute_input":"2022-11-03T20:18:22.328745Z","iopub.status.idle":"2022-11-03T20:18:22.337281Z","shell.execute_reply.started":"2022-11-03T20:18:22.328715Z","shell.execute_reply":"2022-11-03T20:18:22.335934Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"[img[('0028','1050')].value, #window center\n img[('0028','1051')].value, #window width\n img[('0028','1052')].value, #Rescale Intercept\n img[('0028','1053')].value] #Rescale Slope","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:18:22.338864Z","iopub.execute_input":"2022-11-03T20:18:22.339208Z","iopub.status.idle":"2022-11-03T20:18:22.35612Z","shell.execute_reply.started":"2022-11-03T20:18:22.339177Z","shell.execute_reply":"2022-11-03T20:18:22.35463Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"![dcm.png](attachment:7d23ec66-0710-4aab-bc4e-40eaee4de8e4.png)","metadata":{},"attachments":{"7d23ec66-0710-4aab-bc4e-40eaee4de8e4.png":{"image/png":"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"}}},{"cell_type":"code","source":"def brain_window(img):\n    window_min = 0 # El ile ayarlanan pencere ölçüleri\n    window_max = 80\n    _, _, intercept, slope = get_windowing(img)\n    img = img.pixel_array\n    img = img * slope + intercept\n    img[img < window_min] = window_min\n    img[img > window_max] = window_max\n    img = (img - np.min(img)) / (np.max(img) - np.min(img))\n    #print(\"Unique Values -> \", np.unique(img))\n    return img\n\nview_images([brain_window(img) for img in images])","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:18:22.35888Z","iopub.execute_input":"2022-11-03T20:18:22.359406Z","iopub.status.idle":"2022-11-03T20:18:23.123338Z","shell.execute_reply.started":"2022-11-03T20:18:22.359361Z","shell.execute_reply":"2022-11-03T20:18:23.122182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Metadata Windowing","metadata":{}},{"cell_type":"code","source":"def metadata_window(img, print_ranges=True):\n    \"\"\"\n        Her bir dicom file içerisinde verilen window center ve window width değerleri vardır.\n        Metadata başlığı altında bu değerler incelenmiştir\n    \"\"\"\n    # Get data from dcm\n    window_center, window_width, intercept, slope = get_windowing(img)\n    img = img.pixel_array\n    \n    # Window based on dcm metadata\n    img = img * slope + intercept\n    img_min = window_center - window_width // 2\n    img_max = window_center + window_width // 2\n    if print_ranges:\n        print(img_min, img_max)\n    img[img < img_min] = img_min\n    img[img > img_max] = img_max\n    \n    # Normalize\n    img = (img - img_min) / (img_max - img_min)\n    return img\n    \n\nprint('Metadata Window Ranges:')\nview_images([metadata_window(img) for img in images])","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:18:23.125246Z","iopub.execute_input":"2022-11-03T20:18:23.125654Z","iopub.status.idle":"2022-11-03T20:18:24.007682Z","shell.execute_reply.started":"2022-11-03T20:18:23.125621Z","shell.execute_reply":"2022-11-03T20:18:24.006544Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Subdural Window","metadata":{}},{"cell_type":"code","source":"def subdural_window(img):\n    window_min = -20 # El ile ayarlanan pencere ölçüleri\n    window_max = 180\n    _, _, intercept, slope = get_windowing(img)\n    img = img.pixel_array\n    img = img * slope + intercept\n    img[img < window_min] = window_min\n    img[img > window_max] = window_max\n    img = (img - np.min(img)) / (np.max(img) - np.min(img))\n    #print(\"Unique Values -> \", np.unique(img))\n    return img\n\nview_images([subdural_window(img) for img in images])","metadata":{"execution":{"iopub.status.busy":"2022-11-03T20:18:43.711476Z","iopub.execute_input":"2022-11-03T20:18:43.712709Z","iopub.status.idle":"2022-11-03T20:18:44.483086Z","shell.execute_reply.started":"2022-11-03T20:18:43.712669Z","shell.execute_reply":"2022-11-03T20:18:44.482188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}