{"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":"","metadata":{}},{"cell_type":"code","source":"!conda install '/kaggle/input/pydicom-conda-helper/libjpeg-turbo-2.1.0-h7f98852_0.tar.bz2' -c conda-forge -y\n!conda install '/kaggle/input/pydicom-conda-helper/libgcc-ng-9.3.0-h2828fa1_19.tar.bz2' -c conda-forge -y\n!conda install '/kaggle/input/pydicom-conda-helper/gdcm-2.8.9-py37h500ead1_1.tar.bz2' -c conda-forge -y\n!conda install '/kaggle/input/pydicom-conda-helper/conda-4.10.1-py37h89c1867_0.tar.bz2' -c conda-forge -y\n!conda install '/kaggle/input/pydicom-conda-helper/certifi-2020.12.5-py37h89c1867_1.tar.bz2' -c conda-forge -y\n!conda install '/kaggle/input/pydicom-conda-helper/openssl-1.1.1k-h7f98852_0.tar.bz2' -c conda-forge -y","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2021-10-11T00:22:11.916463Z","iopub.execute_input":"2021-10-11T00:22:11.917025Z","iopub.status.idle":"2021-10-11T00:23:20.261365Z","shell.execute_reply.started":"2021-10-11T00:22:11.916903Z","shell.execute_reply":"2021-10-11T00:23:20.260418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport os\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as patches\n%matplotlib inline\nimport glob\nimport pydicom\n\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\nfrom PIL import Image\n\nimport cv2 as cv\n\nimport random \n\nrandom.seed(42)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2021-10-11T00:23:20.263235Z","iopub.execute_input":"2021-10-11T00:23:20.263510Z","iopub.status.idle":"2021-10-11T00:23:21.345086Z","shell.execute_reply.started":"2021-10-11T00:23:20.263481Z","shell.execute_reply":"2021-10-11T00:23:21.344039Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TARGET_SIZE = 512\n\ndef dicom2array(path, voi_lut = True, fix_monochrome = True):\n    \n    dicom = pydicom.read_file(path)\n    \n    \n    if voi_lut:\n        data = apply_voi_lut(dicom.pixel_array, dicom)\n    else:\n        data = dicom.pixel_array\n    \n    if fix_monochrome and dicom.PhotometricInterpretation == \"MONOCHROME1\":\n        data = np.amax(data) - data\n    \n    data = data - np.min(data)\n    data = data / np.max(data)\n    \n    data = data * 255\n    \n    data = data.astype(np.uint8)\n    \n    return data\n\ndef img_vizualisation(imgs, nb_samples = 5):\n    \n    fig, axes = plt.subplots(nrows=nb_samples // 5, ncols=min(5, nb_samples), figsize=(min(5, nb_samples) * 4, 4 * (nb_samples // 5)))\n    i = 0\n    for img in imgs:\n        axes[i // 5, i % 5].imshow(np.array(img), cmap=plt.cm.gray, aspect='auto')\n        axes[i // 5, i % 5].axis('off')\n        i += 1\n    fig.show()    \n","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:23:21.347196Z","iopub.execute_input":"2021-10-11T00:23:21.347608Z","iopub.status.idle":"2021-10-11T00:23:21.358668Z","shell.execute_reply.started":"2021-10-11T00:23:21.347565Z","shell.execute_reply":"2021-10-11T00:23:21.357621Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN_PATH = \"../input/siim-covid19-detection/train/\"\n\npaths = glob.glob(TRAIN_PATH + \"*/*/*.dcm\")","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:23:21.360277Z","iopub.execute_input":"2021-10-11T00:23:21.360597Z","iopub.status.idle":"2021-10-11T00:23:43.290163Z","shell.execute_reply.started":"2021-10-11T00:23:21.360525Z","shell.execute_reply":"2021-10-11T00:23:43.289323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sampled_path = random.sample(paths, 10)\n\nsamples = []\nfor path in sampled_path:\n    img = dicom2array(path)\n    samples.append(img)","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:23:43.291180Z","iopub.execute_input":"2021-10-11T00:23:43.291577Z","iopub.status.idle":"2021-10-11T00:23:46.770819Z","shell.execute_reply.started":"2021-10-11T00:23:43.291549Z","shell.execute_reply":"2021-10-11T00:23:46.769791Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_vizualisation(samples, 10)","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:23:46.772035Z","iopub.execute_input":"2021-10-11T00:23:46.772334Z","iopub.status.idle":"2021-10-11T00:23:54.327631Z","shell.execute_reply.started":"2021-10-11T00:23:46.772305Z","shell.execute_reply":"2021-10-11T00:23:54.326618Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Histogram equalization\n","metadata":{}},{"cell_type":"code","source":"img_example = samples[4]\nimg_example_hist = cv.equalizeHist(img_example)\n\nfig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 10))\n\nax1.imshow(img_example, cmap=plt.cm.gray)\nax1.axis('off')\nax1.set_title(\"Original image\")\n\nax2.imshow(img_example_hist, cmap=plt.cm.gray)\nax2.axis('off')\nax2.set_title(\"Histogram Equalization applied on the original image\")\n\nfig.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2021-10-11T00:23:54.329098Z","iopub.execute_input":"2021-10-11T00:23:54.329741Z","iopub.status.idle":"2021-10-11T00:23:55.491314Z","shell.execute_reply.started":"2021-10-11T00:23:54.329695Z","shell.execute_reply":"2021-10-11T00:23:55.490354Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 4))\n\nax1.hist(img_example.flatten(), 256, [0, 256])\nax1.set_title(\"Original image\")\n\nax2.hist(img_example_hist.flatten(), 256, [0, 256])\nax2.set_title(\"Histogram Equalization applied on the original image\")\n\nfig.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2021-10-11T00:23:55.494387Z","iopub.execute_input":"2021-10-11T00:23:55.495004Z","iopub.status.idle":"2021-10-11T00:23:56.832233Z","shell.execute_reply.started":"2021-10-11T00:23:55.494959Z","shell.execute_reply":"2021-10-11T00:23:56.831518Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Visualization on the sample data","metadata":{}},{"cell_type":"code","source":"import scipy.misc\n\nequalized_samples = []\nfor sample in samples:\n    img = cv.equalizeHist(sample)\n    equalized_samples.append(img)\n    \nimg_vizualisation(equalized_samples, 10)","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:23:56.833667Z","iopub.execute_input":"2021-10-11T00:23:56.834089Z","iopub.status.idle":"2021-10-11T00:24:04.433408Z","shell.execute_reply.started":"2021-10-11T00:23:56.834061Z","shell.execute_reply":"2021-10-11T00:24:04.432721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# CLAHE (Contrast Limited Adaptive Histogram Equalization) \n\n","metadata":{}},{"cell_type":"markdown","source":"### Visualization of CLAHE","metadata":{}},{"cell_type":"code","source":"clahe = cv.createCLAHE(clipLimit=40.0, tileGridSize=(8,8))\n\nimg_example = samples[9]\nimg_example_clahe = clahe.apply(img_example)\n\nfig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 10))\n\nax1.imshow(img_example, cmap=plt.cm.gray)\nax1.axis('off')\nax1.set_title(\"Original image\")\n\nax2.imshow(img_example_clahe, cmap=plt.cm.gray)\nax2.axis('off')\nax2.set_title(\"CLAHE applied on the original image\")\n\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:24:04.434405Z","iopub.execute_input":"2021-10-11T00:24:04.434785Z","iopub.status.idle":"2021-10-11T00:24:06.697446Z","shell.execute_reply.started":"2021-10-11T00:24:04.434738Z","shell.execute_reply":"2021-10-11T00:24:06.696274Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 4))\n\nax1.hist(img_example.flatten(), 256, [0, 256])\nax1.set_title(\"Original image\")\n\nax2.hist(img_example_clahe.flatten(), 256, [0, 256])\nax2.set_title(\"CLAHE applied on the original image\")\n\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:24:06.698979Z","iopub.execute_input":"2021-10-11T00:24:06.699343Z","iopub.status.idle":"2021-10-11T00:24:08.138912Z","shell.execute_reply.started":"2021-10-11T00:24:06.699308Z","shell.execute_reply":"2021-10-11T00:24:08.137823Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Visualization on the sample data","metadata":{}},{"cell_type":"code","source":"clahe_samples = []\n\nclahe = cv.createCLAHE(clipLimit=40.0, tileGridSize=(8,8))\n\nfor sample in samples:\n    img = clahe.apply(sample)\n    clahe_samples.append(img)\n    \nimg_vizualisation(clahe_samples, 10)","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:24:08.140213Z","iopub.execute_input":"2021-10-11T00:24:08.140495Z","iopub.status.idle":"2021-10-11T00:24:16.306582Z","shell.execute_reply.started":"2021-10-11T00:24:08.140467Z","shell.execute_reply":"2021-10-11T00:24:16.305306Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### CLAHE with different parameters","metadata":{}},{"cell_type":"code","source":"clahe_samples_2 = []\n\nclahe = cv.createCLAHE(clipLimit=20.0, tileGridSize=(15, 15))\n\nfor sample in samples:\n    img = clahe.apply(sample)\n    clahe_samples_2.append(img)\n    \nimg_vizualisation(clahe_samples_2, 10)","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:24:16.308453Z","iopub.execute_input":"2021-10-11T00:24:16.308917Z","iopub.status.idle":"2021-10-11T00:24:24.315406Z","shell.execute_reply.started":"2021-10-11T00:24:16.308869Z","shell.execute_reply":"2021-10-11T00:24:24.314096Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Contrast Enhancement of Medical X-Ray ImageUsing Morphological Operators with OptimalStructuring Element\n","metadata":{}},{"cell_type":"code","source":"img_example = equalized_samples[9]\n\nkernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15)) # MORPH_ELLIPSE\n\ntophat_img = cv.morphologyEx(img_example, cv.MORPH_TOPHAT, kernel)\nbothat_img = cv.morphologyEx(img_example, cv.MORPH_BLACKHAT, kernel) # Black --> Bottom\n\noutput = img_example + tophat_img - bothat_img\n\ncompare = np.concatenate((img_example, output), axis=1)\n\nplt.figure(figsize=(20,10))\nplt.imshow(compare, cmap=plt.cm.gray)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:24:24.317259Z","iopub.execute_input":"2021-10-11T00:24:24.317845Z","iopub.status.idle":"2021-10-11T00:24:26.734594Z","shell.execute_reply.started":"2021-10-11T00:24:24.317798Z","shell.execute_reply":"2021-10-11T00:24:26.733257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 4))\n\nax1.hist(img_example.flatten(), 256, [0, 256])\nax1.set_title(\"Original image\")\n\nax2.hist(output.flatten(), 256, [0, 256])\nax2.set_title(\"This approach on the original image\")\n\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:24:26.736540Z","iopub.execute_input":"2021-10-11T00:24:26.736976Z","iopub.status.idle":"2021-10-11T00:24:28.185987Z","shell.execute_reply.started":"2021-10-11T00:24:26.736931Z","shell.execute_reply":"2021-10-11T00:24:28.184904Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"hat_samples = []\n\nkernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15)) # MORPH_ELLIPSE\n\nfor sample in equalized_samples:\n\n    tophat = cv.morphologyEx(sample, cv.MORPH_TOPHAT, kernel)\n    bothat = cv.morphologyEx(sample, cv.MORPH_BLACKHAT, kernel)\n    img = sample + tophat - bothat\n\n    hat_samples.append(img)\n    \nimg_vizualisation(hat_samples, 10)","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:24:28.187529Z","iopub.execute_input":"2021-10-11T00:24:28.187865Z","iopub.status.idle":"2021-10-11T00:24:36.527604Z","shell.execute_reply.started":"2021-10-11T00:24:28.187830Z","shell.execute_reply":"2021-10-11T00:24:36.526367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Noise reduction\n\n## Median filter \n.","metadata":{}},{"cell_type":"code","source":"img_example = samples[0]\nnoised_samples_example = cv.medianBlur(img_example, 5)\n\ncompare = np.concatenate((img_example, noised_samples_example), axis=1)\n\nplt.figure(figsize=(20,10))\nplt.imshow(compare, cmap=plt.cm.gray)","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:24:36.529321Z","iopub.execute_input":"2021-10-11T00:24:36.529758Z","iopub.status.idle":"2021-10-11T00:24:38.305061Z","shell.execute_reply.started":"2021-10-11T00:24:36.529704Z","shell.execute_reply":"2021-10-11T00:24:38.303915Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 4))\n\nax1.hist(img_example.flatten(), 256, [0, 256])\nax1.set_title(\"Original image\")\n\nax2.hist(noised_samples_example.flatten(), 256, [0, 256])\nax2.set_title(\"Noise reduction on the original image\")\n\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:24:38.306999Z","iopub.execute_input":"2021-10-11T00:24:38.307879Z","iopub.status.idle":"2021-10-11T00:24:39.694205Z","shell.execute_reply.started":"2021-10-11T00:24:38.307805Z","shell.execute_reply":"2021-10-11T00:24:39.693418Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## DCT-based filter\n","metadata":{}},{"cell_type":"code","source":"\nfrom scipy.fftpack import dct, idct\n\ndef dct2(a):\n    return dct(dct(a.T, norm='ortho').T, norm='ortho')\n\ndef idct2(a):\n    return idct(idct(a.T, norm='ortho').T, norm='ortho')  \n\ndef dtc_transform(img):\n    return idct2(dct2(img))\n\nimg_example = samples[0]\nimg_idct = dtc_transform(img_example)\n\nprint(\"Check if the image are similar :\", np.allclose(img_example, img_idct))\n\ncompare = np.concatenate((img_example, img_idct), axis=1)\n\nplt.figure(figsize=(20,10))\nplt.imshow(compare, cmap=plt.cm.gray)","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:24:39.695354Z","iopub.execute_input":"2021-10-11T00:24:39.695783Z","iopub.status.idle":"2021-10-11T00:24:42.944149Z","shell.execute_reply.started":"2021-10-11T00:24:39.695732Z","shell.execute_reply":"2021-10-11T00:24:42.942980Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 4))\n\nax1.hist(img_example.flatten(), 256, [0, 256])\nax1.set_title(\"Original image\")\n\nax2.hist(img_idct.flatten(), 256, [0, 256])\nax2.set_title(\"Noise reduction on the original image\")\n\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:24:42.945644Z","iopub.execute_input":"2021-10-11T00:24:42.945993Z","iopub.status.idle":"2021-10-11T00:24:44.649200Z","shell.execute_reply.started":"2021-10-11T00:24:42.945957Z","shell.execute_reply":"2021-10-11T00:24:44.648114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dct_samples = []\n\nfor sample in samples:\n    img = dtc_transform(sample)\n    dct_samples.append(img)\n    \nimg_vizualisation(dct_samples, 10)","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:24:44.650848Z","iopub.execute_input":"2021-10-11T00:24:44.651178Z","iopub.status.idle":"2021-10-11T00:25:06.543630Z","shell.execute_reply.started":"2021-10-11T00:24:44.651145Z","shell.execute_reply":"2021-10-11T00:25:06.542739Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Combine the different approaches","metadata":{}},{"cell_type":"code","source":"channel_1 = samples[9]\nchannel_2 = clahe_samples_2[9]\nchannel_3 = hat_samples[9]\n\n\noutput = np.dstack((channel_1, channel_2, channel_3))\n\nreference = np.dstack((channel_1, channel_1, channel_1))\n\n\ncompare = np.concatenate((reference, output), axis=1)\n\nplt.figure(figsize=(20,10))\nplt.imshow(compare)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:25:06.544831Z","iopub.execute_input":"2021-10-11T00:25:06.545239Z","iopub.status.idle":"2021-10-11T00:25:09.070501Z","shell.execute_reply.started":"2021-10-11T00:25:06.545194Z","shell.execute_reply":"2021-10-11T00:25:09.069453Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"multi_channel_samples = []\n\nfor i in range(len(samples)):\n    channel_1 = samples[i]\n    channel_2 = clahe_samples_2[i]\n    # channel_2 = clahe_samples[i]\n    channel_3 = hat_samples[i]\n    \n    out_img = np.dstack((channel_1, channel_2, channel_3))\n    \n    multi_channel_samples.append(out_img)\n    \nimg_vizualisation(multi_channel_samples, 10)","metadata":{"execution":{"iopub.status.busy":"2021-10-11T00:25:09.073503Z","iopub.execute_input":"2021-10-11T00:25:09.073826Z","iopub.status.idle":"2021-10-11T00:25:17.552046Z","shell.execute_reply.started":"2021-10-11T00:25:09.073786Z","shell.execute_reply":"2021-10-11T00:25:17.550732Z"},"trusted":true},"execution_count":null,"outputs":[]}]}