{"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 os\nimport cv2\nimport glob\nimport random\nimport pydicom\nimport skimage.io\nimport numpy as np\nimport pandas as pd\nfrom pydicom import dcmread\nimport matplotlib.pyplot as plt\nfrom skimage.data import gravel\nfrom scipy.fft import fftn, fftshift\nfrom skimage.util import compare_images\nfrom skimage.filters import difference_of_gaussians, window\nfrom skimage.morphology import (erosion, dilation, opening, closing)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-03-28T09:47:13.760027Z","iopub.execute_input":"2022-03-28T09:47:13.760391Z","iopub.status.idle":"2022-03-28T09:47:14.247443Z","shell.execute_reply.started":"2022-03-28T09:47:13.760346Z","shell.execute_reply":"2022-03-28T09:47:14.246989Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Task 1 - Noise Removal","metadata":{}},{"cell_type":"markdown","source":"**Morphological**\n\n*   erode\n*   dilate\n*   open\n*   close\n","metadata":{}},{"cell_type":"code","source":"inchi3 = cv2.imread('../input/picturefiles/inchi3.png')\nspeckle=cv2.imread(\"../input/picturefiles/3.png\")\nscooby=cv2.imread(\"../input/picturefiles/scooby_day.jpg\")","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:14.249945Z","iopub.execute_input":"2022-03-28T09:47:14.250161Z","iopub.status.idle":"2022-03-28T09:47:14.440246Z","shell.execute_reply.started":"2022-03-28T09:47:14.250140Z","shell.execute_reply":"2022-03-28T09:47:14.439506Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"grayInchi3 = cv2.cvtColor(inchi3, cv2.COLOR_RGB2GRAY)\nbwinchi3 = cv2.subtract(255, grayInchi3) ","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:14.441251Z","iopub.execute_input":"2022-03-28T09:47:14.443032Z","iopub.status.idle":"2022-03-28T09:47:14.446988Z","shell.execute_reply.started":"2022-03-28T09:47:14.442984Z","shell.execute_reply":"2022-03-28T09:47:14.446300Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def display_output(img1,img2,filtertype):\n    plt.figure(figsize=(11,6))\n    plt.subplot(121),plt.imshow(img1,cmap='gray'),plt.title('Original')\n    plt.xticks([]), plt.yticks([])\n    plt.subplot(122),plt.imshow(img2,cmap='gray'),plt.title(filtertype)\n    plt.xticks([]), plt.yticks([])\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:14.448504Z","iopub.execute_input":"2022-03-28T09:47:14.448706Z","iopub.status.idle":"2022-03-28T09:47:14.456579Z","shell.execute_reply.started":"2022-03-28T09:47:14.448686Z","shell.execute_reply":"2022-03-28T09:47:14.455957Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"kernel_size=(3,3)\nkernel = np.ones(kernel_size, np.uint8)\n\nclosed = cv2.morphologyEx(bwinchi3, cv2.MORPH_CLOSE, kernel, iterations=1)\nerosed = cv2.erode(closed, kernel_size, iterations=1)\ndilated = cv2.dilate(erosed, kernel, iterations=1)\nrestoredmorph = cv2.subtract(255, dilated) ","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:14.457808Z","iopub.execute_input":"2022-03-28T09:47:14.458325Z","iopub.status.idle":"2022-03-28T09:47:14.466356Z","shell.execute_reply.started":"2022-03-28T09:47:14.458287Z","shell.execute_reply":"2022-03-28T09:47:14.465908Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cv2.imwrite('final.png',restoredmorph)\ndisplay_output(inchi3,restoredmorph,'Morphological Filter')","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:14.467249Z","iopub.execute_input":"2022-03-28T09:47:14.467505Z","iopub.status.idle":"2022-03-28T09:47:14.609273Z","shell.execute_reply.started":"2022-03-28T09:47:14.467472Z","shell.execute_reply":"2022-03-28T09:47:14.608624Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Spatial filters**\n\n*   Mean \n*   Median\n*   Gaussian \n*   Convolution\n*   Bilateral \n*   Laplacian","metadata":{}},{"cell_type":"code","source":"dilated = cv2.dilate(bwinchi3, kernel, iterations=1)\nmedianfilt= cv2.medianBlur(dilated, 5)\nrestoredmf = cv2.subtract(255, medianfilt) \ncv2.imwrite('medianfilt.png', restoredmf)\ndisplay_output(inchi3,restoredmf,'Median Filter')\n","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:14.610400Z","iopub.execute_input":"2022-03-28T09:47:14.611192Z","iopub.status.idle":"2022-03-28T09:47:14.766938Z","shell.execute_reply.started":"2022-03-28T09:47:14.611151Z","shell.execute_reply":"2022-03-28T09:47:14.766307Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"erosed = cv2.erode(bwinchi3, kernel_size, iterations=1)\ngausfil = cv2.GaussianBlur(erosed, (3,3),0)\nrestoredgf = cv2.subtract(255, gausfil) \ncv2.imwrite('gaussianfilt.png', restoredgf)\ndisplay_output(inchi3,restoredgf,'Gaussian Filter')","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:14.768072Z","iopub.execute_input":"2022-03-28T09:47:14.768815Z","iopub.status.idle":"2022-03-28T09:47:14.925159Z","shell.execute_reply.started":"2022-03-28T09:47:14.768774Z","shell.execute_reply":"2022-03-28T09:47:14.924655Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"erosed = cv2.erode(bwinchi3, kernel_size, iterations=1)\nkernel_conv = np.ones((3,3),np.float32)\nconv_inchi3 = cv2.filter2D(erosed,0,kernel_conv)\nrestoredconv = cv2.subtract(255, conv_inchi3) \ncv2.imwrite('conv.png', restoredconv)\ndisplay_output(inchi3,restoredconv,'Convolution Filter')","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:14.926189Z","iopub.execute_input":"2022-03-28T09:47:14.927016Z","iopub.status.idle":"2022-03-28T09:47:15.089351Z","shell.execute_reply.started":"2022-03-28T09:47:14.926974Z","shell.execute_reply":"2022-03-28T09:47:15.088443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Frequency filter**","metadata":{}},{"cell_type":"code","source":"windowIm = bwinchi3 * window('hann', bwinchi3.shape)  # window image to improve FFT\nfilteredIm = difference_of_gaussians(bwinchi3, 1, 12)\nfilteredIm_up = filteredIm * window('hann', bwinchi3.shape)\nim_f_mag = fftshift(np.abs(fftn(windowIm)))\nfim_f_mag = fftshift(np.abs(fftn(filteredIm_up)))\n\nfig, ax = plt.subplots(nrows=2, ncols=2, figsize=(8, 8))\nax[0, 0].imshow(bwinchi3, cmap='gray')\nax[0, 0].set_title('Original Image')\nax[0, 1].imshow(np.log(im_f_mag), cmap='magma')\nax[0, 1].set_title('Original FFT Magnitude (log)')\nax[1, 0].imshow(filteredIm, cmap='gray')\nax[1, 0].set_title('Filtered Image')\nax[1, 1].imshow(np.log(fim_f_mag), cmap='magma')\nax[1, 1].set_title('Filtered FFT Magnitude (log)')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:15.090835Z","iopub.execute_input":"2022-03-28T09:47:15.091098Z","iopub.status.idle":"2022-03-28T09:47:15.632245Z","shell.execute_reply.started":"2022-03-28T09:47:15.091061Z","shell.execute_reply":"2022-03-28T09:47:15.631326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"windowIm = erosed * window('hann', erosed.shape)  # window image to improve FFT\nfilteredIm = difference_of_gaussians(erosed, 1.5)\nfilteredIm_up = filteredIm * window('hann', bwinchi3.shape)\nim_f_mag = fftshift(np.abs(fftn(windowIm)))\nfim_f_mag = fftshift(np.abs(fftn(filteredIm_up)))\n\nfig, ax = plt.subplots(nrows=2, ncols=2, figsize=(8, 8))\nax[0, 0].imshow(erosed, cmap='gray')\nax[0, 0].set_title('Original Image')\nax[0, 1].imshow(np.log(im_f_mag), cmap='magma')\nax[0, 1].set_title('Original FFT Magnitude (log)')\nax[1, 0].imshow(filteredIm, cmap='gray')\nax[1, 0].set_title('Filtered Image')\nax[1, 1].imshow(np.log(fim_f_mag), cmap='magma')\nax[1, 1].set_title('Filtered FFT Magnitude (log)')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:15.633740Z","iopub.execute_input":"2022-03-28T09:47:15.634123Z","iopub.status.idle":"2022-03-28T09:47:16.165770Z","shell.execute_reply.started":"2022-03-28T09:47:15.634087Z","shell.execute_reply":"2022-03-28T09:47:16.165142Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Gaussian Noise Addition**\n","metadata":{}},{"cell_type":"code","source":"scale_percent = 30 # percent of original size\nwidth = int(scooby.shape[1] * scale_percent / 100)\nheight = int(scooby.shape[0] * scale_percent / 100)\ndimension = (width, height)\n\n# resize image\nscooby_day_res = cv2.resize(scooby, dimension, interpolation = cv2.INTER_AREA)\nimg_noise=skimage.util.random_noise(scooby_day_res, mode='gaussian', seed=None, var=(15/255.0)**2) #add  gaussian noise\nimg_noise=img_noise*255 ","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:16.167166Z","iopub.execute_input":"2022-03-28T09:47:16.167422Z","iopub.status.idle":"2022-03-28T09:47:16.290693Z","shell.execute_reply.started":"2022-03-28T09:47:16.167390Z","shell.execute_reply":"2022-03-28T09:47:16.290221Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cv2.imwrite('gaussiannoise.jpg',img_noise)","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:16.292557Z","iopub.execute_input":"2022-03-28T09:47:16.293473Z","iopub.status.idle":"2022-03-28T09:47:16.325287Z","shell.execute_reply.started":"2022-03-28T09:47:16.293418Z","shell.execute_reply":"2022-03-28T09:47:16.324919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"gausfil = cv2.GaussianBlur(img_noise, (9,9),5)","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:16.325996Z","iopub.execute_input":"2022-03-28T09:47:16.326265Z","iopub.status.idle":"2022-03-28T09:47:16.349148Z","shell.execute_reply.started":"2022-03-28T09:47:16.326234Z","shell.execute_reply":"2022-03-28T09:47:16.348430Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cv2.imwrite('final_scoob.jpg',gausfil)","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:16.350195Z","iopub.execute_input":"2022-03-28T09:47:16.350402Z","iopub.status.idle":"2022-03-28T09:47:16.375946Z","shell.execute_reply.started":"2022-03-28T09:47:16.350377Z","shell.execute_reply":"2022-03-28T09:47:16.375365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Task 2 - Speckle Removal","metadata":{}},{"cell_type":"code","source":"grayxray = cv2.cvtColor(speckle, cv2.COLOR_RGB2GRAY)\nfinal_xray = cv2.fastNlMeansDenoising(grayxray)\ncv2.imwrite('xray.jpg',final_xray)","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:16.377037Z","iopub.execute_input":"2022-03-28T09:47:16.377196Z","iopub.status.idle":"2022-03-28T09:47:16.586396Z","shell.execute_reply.started":"2022-03-28T09:47:16.377175Z","shell.execute_reply":"2022-03-28T09:47:16.586003Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport numpy as np\nimport cv2\nfrom skimage import io\nfrom skimage.util import compare_images\n\n\ndef mean_filtering(input_image, window_size=(15, 15)):\n    filtered_image = cv2.blur(input_image, window_size)\n    filtered_image = np.nan_to_num(filtered_image)\n    return filtered_image\n\ndef bilateral_filtering(input_image, window_size=15, sigma_color=5, sigma_space=5):\n    filtered_image = cv2.bilateralFilter(input_image, window_size, sigma_color, sigma_space)\n    filtered_image = np.nan_to_num(filtered_image)\n    return filtered_image\n\ndef gaussian_filtering(input_image, window_size=(15, 15)):\n    filtered_image = cv2.GaussianBlur(input_image, window_size, sigma_x, sigma_y)\n    filtered_image = np.nan_to_num(filtered_image)\n    return filtered_image\n\ndef exp_transformation(input_image):\n    filtered_image = np.expm1(input_image)\n    return filtered_image*(255/np.max(filtered_image))\n\ndef image_filters():\n\n    image_ref = io.imread('../input/picturefiles/3.png', as_gray=True)\n\n    fig, axs = plt.subplots(1, 3, figsize=(11, 6))\n    axs[0].imshow(speckle, cmap='gray', vmin=0, vmax=255)\n    axs[0].set_title(\"Original Image\")\n\n    log_input = np.log1p(image_ref).astype(np.float32)\n    mean_output = exp_transformation(mean_filtering(log_input))\n    axs[1].imshow(mean_output, cmap='gray')\n    axs[1].set_title(\"Mean Filtering\")\n\n    gauss_mean = exp_transformation(bilateral_filtering(log_input))\n    axs[2].imshow(gauss_mean, cmap='gray')\n    axs[2].set_title(\"Gaussian Filtering\")\n\n    for j in range(3):\n        axs[j].set_xticks([])\n        axs[j].set_yticks([])\n    plt.tight_layout()\n    plt.show()\n    cv2.imwrite('finalxray.jpg',gauss_mean)\n\n\nimage_filters()","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:16.587614Z","iopub.execute_input":"2022-03-28T09:47:16.587882Z","iopub.status.idle":"2022-03-28T09:47:16.962428Z","shell.execute_reply.started":"2022-03-28T09:47:16.587849Z","shell.execute_reply":"2022-03-28T09:47:16.962024Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Task 3 - Visualization of the MRI data","metadata":{}},{"cell_type":"code","source":"path = \"../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/00015/\"","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:16.963260Z","iopub.execute_input":"2022-03-28T09:47:16.963987Z","iopub.status.idle":"2022-03-28T09:47:16.967192Z","shell.execute_reply.started":"2022-03-28T09:47:16.963962Z","shell.execute_reply":"2022-03-28T09:47:16.966549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"types=(\"FLAIR\", \"T1w\", \"T1wCE\", \"T2w\")\nfps = []\npath = os.path.join(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/00015/\")\nfor i, t in enumerate(types, 1):\n    t_paths = sorted(glob.glob(os.path.join(path, t, \"*\")))\n    for file in t_paths:\n        fps.append(file)","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:16.967966Z","iopub.execute_input":"2022-03-28T09:47:16.968306Z","iopub.status.idle":"2022-03-28T09:47:16.985950Z","shell.execute_reply.started":"2022-03-28T09:47:16.968284Z","shell.execute_reply":"2022-03-28T09:47:16.985338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dcm = dcmread(fps[200])","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:16.986837Z","iopub.execute_input":"2022-03-28T09:47:16.986993Z","iopub.status.idle":"2022-03-28T09:47:16.992271Z","shell.execute_reply.started":"2022-03-28T09:47:16.986973Z","shell.execute_reply":"2022-03-28T09:47:16.991657Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(dcm)","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:16.993387Z","iopub.execute_input":"2022-03-28T09:47:16.993551Z","iopub.status.idle":"2022-03-28T09:47:17.001604Z","shell.execute_reply.started":"2022-03-28T09:47:16.993531Z","shell.execute_reply":"2022-03-28T09:47:17.001105Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.imshow(dcm.pixel_array, cmap=plt.cm.bone) \nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:17.002633Z","iopub.execute_input":"2022-03-28T09:47:17.002829Z","iopub.status.idle":"2022-03-28T09:47:17.128598Z","shell.execute_reply.started":"2022-03-28T09:47:17.002799Z","shell.execute_reply":"2022-03-28T09:47:17.127950Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dicom(path):\n    dicom = pydicom.read_file(path)\n    data = dicom.pixel_array\n    data = data - np.min(data)\n    if np.max(data) != 0:\n        data = data / np.max(data)\n    data = (data * 255).astype(np.uint8)\n    return data\n\ndef visualize_sample(slice_i, types=(\"FLAIR\", \"T1w\", \"T1wCE\", \"T2w\")):\n    plt.figure(figsize=(16, 5))\n    patient_path = os.path.join(\"../input/rsna-miccai-brain-tumor-radiogenomic-classification/test/00015/\")\n    for i, t in enumerate(types, 1):\n        t_paths = sorted(glob.glob(os.path.join(patient_path, t, \"*\")), key=lambda x: int(x[:-4].split(\"-\")[-1]))\n        data = load_dicom(t_paths[int(len(t_paths) * slice_i)])\n        plt.subplot(1, 4, i)\n        plt.imshow(data, cmap=\"gray\")\n        plt.title(f\"{t}\", fontsize=16)\n        plt.axis(\"off\")\n    plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:17.129423Z","iopub.execute_input":"2022-03-28T09:47:17.129898Z","iopub.status.idle":"2022-03-28T09:47:17.138707Z","shell.execute_reply.started":"2022-03-28T09:47:17.129869Z","shell.execute_reply":"2022-03-28T09:47:17.137891Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"visualize_sample(slice_i=0.5)","metadata":{"execution":{"iopub.status.busy":"2022-03-28T09:47:17.139923Z","iopub.execute_input":"2022-03-28T09:47:17.140112Z","iopub.status.idle":"2022-03-28T09:47:17.434220Z","shell.execute_reply.started":"2022-03-28T09:47:17.140086Z","shell.execute_reply":"2022-03-28T09:47:17.433483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}