{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":29653,"databundleVersionId":2420395,"sourceType":"competition"}],"dockerImageVersionId":31040,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Baca Data & Sampling","metadata":{}},{"cell_type":"markdown","source":"Mengambil data dicom hanya pada folder FLAIR karena ....\n\nLalu melakukan sampling sebanyak 50% dari keseluruhan pasien secara random","metadata":{}},{"cell_type":"code","source":"import os\nimport pydicom\nimport random\nfrom tqdm import tqdm  # pastikan tqdm sudah terinstall\n\n# Path ke folder train\ntrain_path = '/kaggle/input/rsna-miccai-brain-tumor-radiogenomic-classification/train/'\n\n# Ambil semua folder pasien\nall_patients = [p for p in os.listdir(train_path) if os.path.isdir(os.path.join(train_path, p))]\n\n# Acak dan ambil 10% folder pasien\nsample_size = max(1, int(0.3 * len(all_patients)))\nsampled_patients = random.sample(all_patients, sample_size)\n\n# List untuk menyimpan data DICOM FLAIR\ndicom_data_flair = []\n\n# Iterasi tiap pasien dengan progress bar\nfor patient_id in tqdm(sampled_patients, desc=\"Memuat data DICOM FLAIR\"):\n    flair_path = os.path.join(train_path, patient_id, 'FLAIR')\n    if os.path.isdir(flair_path):\n        for dcm_file in os.listdir(flair_path):\n            if dcm_file.endswith('.dcm'):\n                dcm_path = os.path.join(flair_path, dcm_file)\n                try:\n                    dicom = pydicom.dcmread(dcm_path)\n                    dicom_data_flair.append(dicom)\n                except Exception as e:\n                    print(f\"Gagal membaca {dcm_path}: {e}\")\n\nprint(f\"\\nTotal pasien diambil: {len(sampled_patients)}\")\nprint(f\"Total file DICOM FLAIR dimuat: {len(dicom_data_flair)}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:45:28.936641Z","iopub.execute_input":"2025-05-19T12:45:28.937005Z","iopub.status.idle":"2025-05-19T12:48:28.042543Z","shell.execute_reply.started":"2025-05-19T12:45:28.936978Z","shell.execute_reply":"2025-05-19T12:48:28.041512Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dicom_data_flair[0]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:48:28.044703Z","iopub.execute_input":"2025-05-19T12:48:28.045632Z","iopub.status.idle":"2025-05-19T12:48:28.056940Z","shell.execute_reply.started":"2025-05-19T12:48:28.045570Z","shell.execute_reply":"2025-05-19T12:48:28.055651Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Preprocessing","metadata":{}},{"cell_type":"markdown","source":"## Ambil Gambar Pixel","metadata":{}},{"cell_type":"code","source":"import pandas as pd\n\n# Simpan hasil ke dalam DataFrame\ndata = []\n\nfor dicom in dicom_data_flair:\n    try:\n        image_array = dicom.pixel_array  # Ambil data citra (2D array)\n        data.append({\n            \"file_path\": dicom.filename,\n            \"image\": image_array\n        })\n    except Exception as e:\n        print(f\"Gagal mengambil pixel_array dari {dicom.filename}: {e}\")\n\ndf_dicom_flair = pd.DataFrame(data)\n\nprint(f\"\\nTotal file disimpan dalam DataFrame: {len(df_dicom_flair)}\")\ndf_dicom_flair.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:48:52.212391Z","iopub.execute_input":"2025-05-19T12:48:52.213729Z","iopub.status.idle":"2025-05-19T12:49:12.010204Z","shell.execute_reply.started":"2025-05-19T12:48:52.213678Z","shell.execute_reply":"2025-05-19T12:49:12.009132Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# Menampilkan 1 gambar pertama\nplt.imshow(df_dicom_flair.iloc[1000][\"image\"], cmap='gray')\nplt.title(df_dicom_flair.iloc[1000][\"file_path\"])\nplt.axis('off')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:50:00.693650Z","iopub.execute_input":"2025-05-19T12:50:00.694004Z","iopub.status.idle":"2025-05-19T12:50:00.923701Z","shell.execute_reply.started":"2025-05-19T12:50:00.693978Z","shell.execute_reply":"2025-05-19T12:50:00.921692Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Resize","metadata":{}},{"cell_type":"code","source":"import cv2\nimport numpy as np\n\ndef resize_images(df, image_column='image', size=(256, 256)):\n    resized_images = []\n    for img in df[image_column]:\n        resized = cv2.resize(img, size, interpolation=cv2.INTER_AREA)\n        resized_images.append(resized)\n    df['resized'] = resized_images\n    return df\n\ndf_dicom_flair = resize_images(df_dicom_flair, image_column='image', size=(256, 256))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:50:02.717537Z","iopub.execute_input":"2025-05-19T12:50:02.717888Z","iopub.status.idle":"2025-05-19T12:50:08.266270Z","shell.execute_reply.started":"2025-05-19T12:50:02.717861Z","shell.execute_reply":"2025-05-19T12:50:08.264667Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\ndef show_images_side_by_side(df, col1, col2, index=0):\n    fig, axs = plt.subplots(1, 2, figsize=(10, 5))\n\n    axs[0].imshow(df.iloc[index][col1], cmap='gray')\n    axs[0].set_title(col1)\n    axs[0].axis('off')\n\n    axs[1].imshow(df.iloc[index][col2], cmap='gray')\n    axs[1].set_title(col2)\n    axs[1].axis('off')\n\n    plt.tight_layout()\n    plt.show()\n\nshow_images_side_by_side(df_dicom_flair, 'image', 'resized', index=1000)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:50:08.268816Z","iopub.execute_input":"2025-05-19T12:50:08.269629Z","iopub.status.idle":"2025-05-19T12:50:08.759549Z","shell.execute_reply.started":"2025-05-19T12:50:08.269593Z","shell.execute_reply":"2025-05-19T12:50:08.757610Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Enhancement Histogram CLAHE","metadata":{},"attachments":{"a82c0f2d-f95b-4cf5-b967-daaf194576d5.png":{"image/png":"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"},"59c72951-c6d6-492d-9479-1e039ce42844.png":{"image/png":"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"},"6bfcb1ed-e2fe-4395-8eac-23119efaccda.png":{"image/png":"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"},"c9e013db-b52a-46c1-9c86-e69b98c9e8a2.png":{"image/png":"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"}}},{"cell_type":"code","source":"import cv2\nimport numpy as np\n\ndef apply_clahe(image, clip_limit=2.0, tile_grid_size=(8, 8)):\n    \"\"\"\n    Melakukan CLAHE (Contrast Limited Adaptive Histogram Equalization)\n    untuk memperjelas citra medis grayscale.\n    \n    Parameter:\n    - clip_limit: batas kontras untuk mencegah noise\n    - tile_grid_size: ukuran patch untuk pengolahan lokal\n    \"\"\"\n    if image.dtype != np.uint8:\n        # Normalize ke rentang 0-255 dan konversi ke uint8\n        image = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)\n    \n    clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=tile_grid_size)\n    enhanced = clahe.apply(image)\n    return enhanced\n\n# Terapkan CLAHE untuk setiap gambar pada kolom 'resized'\ndf_dicom_flair['enhancement'] = df_dicom_flair['resized'].apply(apply_clahe)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:50:08.967882Z","iopub.execute_input":"2025-05-19T12:50:08.968335Z","iopub.status.idle":"2025-05-19T12:50:18.240850Z","shell.execute_reply.started":"2025-05-19T12:50:08.968305Z","shell.execute_reply":"2025-05-19T12:50:18.239786Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"show_images_side_by_side(df_dicom_flair, 'resized', 'enhancement', index=1000)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:50:18.242353Z","iopub.execute_input":"2025-05-19T12:50:18.242649Z","iopub.status.idle":"2025-05-19T12:50:18.558725Z","shell.execute_reply.started":"2025-05-19T12:50:18.242627Z","shell.execute_reply":"2025-05-19T12:50:18.557487Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Unsharp Masking","metadata":{},"attachments":{"6c6b0bb4-8a79-44cf-b588-48d2d3a830dc.png":{"image/png":"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"},"ff9a0742-aae8-4a62-86bd-bd46722250bc.png":{"image/png":"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"},"38059a11-3b6e-4b13-89b5-de309f808909.png":{"image/png":"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"},"fee92993-dc61-43ab-b615-db6964f4d757.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAvcAAADBCAMAAAB8HW8QAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABjUExURQAAAPPv8/Lv8vPv8fLv8vT09PPx8vPw8vPx8vTv7+/v7/Lw8P////Pw8/Tw8u/v7/Pw8/Px8vLy8vPx8vTx8/Tx8vPw8vPx8/Hx8fPw8vTy9PHx8fTx8vPw8PPx8fHv8fPx88wx8e0AAAAhdFJOUwBAUIBgGNf/9zAgeAi/3xDP5yjHj5+vl0jvhzi3aFhwp//3rMQAAAAJcEhZcwAAFxEAABcRAcom8z8AABKCSURBVHhe7Z3peuo6DEWbhhbaQjl0pCN9/6e8cSx5lBOrhOHr3evPOcSuiaUdD7IdLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADANJftrLmiD2ByYN+z5HpuWNzQRzAxsO9Zctu7ZT6f0WcwLbDveQK/HBaNfW+au8uG/v8XuWqa0QHfsstzS/8/JND9Yam373LVZ7z/q8pf/+vrt3mgzxLLR5vn8KPCP6D79dN9X4XF6rnWXrfPdtg9v76jK4ei3r53lPMfff5rNFS/IUuwtVr6fDj+gO5fqAqGV7o2zHZB2TsOLPx6+9rmvuOPxn6g+2lZUg0sNTJ+eKPMhmu6eCDq7Ws7rY4/GvqB7qflhmpgWVS0lq+U10IXDwR0z0D308L2JN7pcpmrYJTTQVcPRL197ZSuY00X/hjQ/bQkut8s6XqRlnISdPVA1Nv3nXJiXgvd18D23NC/l3S9xJIy8riCLh+IevtyHPODPv81oPtpYXu+0/Dlk66XuKRsHD+hywdCY9+b5m77d9etoPtpYXu2z/SfkZkt6f3y/HT/t4Hup8Xp/oP/QwkyFP7Z0LACuj8W0P20ON3T1sf5hhJknmymd7dORNcPBHTPQPfT4nXPK/1DM9slrVndQvdHBrqfFq97Dsy/UIrEl83STX6h++MC3U+L1z3v1Blas7WbAk2XAN0flyl1v2y2d+N7mi/WTfPdbhtpB6jgl7oyO26abTtrmup19dtm145srr5tvmb1BfYEuqcQ5cAmHZr7msWtcd1X109n3/2odHnHR2OgD6dnD91fvqxWq1dWztUdL71sXgeqd/NEbZzZqXuXyi7xy/qLl8sHy7x4+PrhdSJTbCurObrfSyr5emc/d1x+dunvvC6/nH3aHPP541f9Yn2g+wtekrIpAj82g9nMMKj7uvr1qOzrWO9M3Vd3QT23r92FF2+dnl+5vDPls9vuc/3TBnxTjuPze92v7fjV7rW9IhcSj4VW6cNpifiM1wMjvyx57cdSKtNb3/MiuCG8Xzp10PPVp7p06+n1U7hLcr54Hd1vQIS657X+rU3K4BmA0VFZ97X1M6js67nlb/BdE1kjnpX/xuUX6zYyZQwb/+j8Xvd09dn8f5ZVTerclyyEkChj6Jetb+IIqczbZ3JQQr4hLLjfh1BJnJPS+0rm331duWAf6v6B/l+a2e6C5JLu6+unta/HyX7uHycxZ2DCSpd3phxQfe0JhQMwhe7XaStjiDMbwkY2IBxDBNaOt+da8jK/ZFV0PKYttL/fm8gVvRd9evcdS15rDVnU9cmh7lnMpZktya1vUgu6V9RPaV/PmlYa5vMnutIh5vQmrHS5W6AosaJsR2cC3RfsnQwNL5aSqTrChtRZu5A5LZPvXoL1zLj7vY1boEz3ok879Va1+JHuZ/QhvW0LzXvtwpase039VPalzwY6RdoRlijl9CasdLk/rlgircTR2F/3BRtkrZwzQTcxu9u2TyuSXzhU5W/asQwS0jLDIeaim3JFt5IsGPH9Ll3zZkl1X6rP/G1gOumIdM/LUvIpKopzWqvKutfUT2PfwNv+cYk0KOT0Jqx1+cU3JXRP92f73b5kf5fU4XjsrXtXl9WuWV58fHlVxcNansQtnpxxvnuTS+0R9+4jZbrTEY8zLuXqzrXmydZxdhoPYhafTyszjOdhKaW7eMhm16wv1k3rh/pDK1BMpHs3WJOmoVeUZs0h615RP5V9A2+7MV3c9Ao53cVal7tN1n478w3X6LqP55Rm/Idnb90T//jJDQbH0Qyf51zRE37zMl9I40/LaJlWLW/vUUN85Rqw2KpUNg2q32yFH9pPlkn83RtnkGC2WIiihMS6581pP/2nGCqWpCLrXlE/lX29t934Oxlx5Dk7tO7hwl+Ce6Al6hpbHpKJdB/Oy12HG8UcqFEIpk49D1H9lWWa9vStDR3bw82R3IL1rNIeOUl/DgtlV9UcPop1z7cSic/CbSGJR9a9on4q+zpvO7smss9zGpTu4VhobDZ6GMZPoh2UaXQfT2j4MQ8XbLhXL0V5Lboyu/wraUmJ6xTbOyz7n2D0MD2uqY8thWMGmUT3FKoUZnw09OXtmrLu6+unsy97myfemeyznD1K9/DoPrYaP/C5SY7JJLpP/ti9UyBYKqdY9ht9LKArswi/wyZSd1D2vSCmMD2R/YWbCktR85hE9zzqznsKGujyV8m6LyDUT2dfMu6WPuayT3NalO6h4U86LaKHrWa2dDim0H226MZODMaa9D3lNfseXZlFuBmLGhpfthyY8emp7P1IZ/z1NonuXUQm7SlYKDzeUuleqJ/OvtbbHxw+yGWf5CSU7qGpVLrwQVU/8KuCRphA97lMhB1Z7OfhUZ2uzCJcqcLcQa6rS0+HyB0ubTSUmeqem9RUWjQwcI2eSvdC/XT27S3glu8E2cc5GWeGOvdQ+ekjv7aXR271wOyveyFWwTULDMq5h0d1ujKLcDGy06TgSgeni/0vh99GF21T3fPmtEXs5SU1ta55VOleqB9fqrOv+UO3O0G0qPAV/mKde/jVcdmgkkxSM2I9GPvrXvpLqlloUbo0/HJZZZlFbFbZaZs8lNMz9N3uLTejA/xM9/yX8ciA5rt+WKLSvVQ/rX3Xg7KXraFzD+Ve0EcPZT1pJPMwuicvhk0nx0QWQwN0ZZlFbFbZaaUWcei7R7eYOTLdc7HxzJZCkX5UsLfulfZdysFeh2iNIRMJ7rFXsjdKcNdQs/x9MA6je1paCXcd3fAkau4XFDOUZRaxWeudZhhOp7sfnYxluuf7jiKMlCtY199b9zr7ut0Jpe5TtIbSPTS+TxdleTFPCqodjcPoniJYkUbd2sZ88VR61LVllrBZ651mGE7nUQF9LJLrnqPY4ToPRXmCxnFv3evsy2Gm4qhRtIbSPdSlpB0s3ehIyPXAHE/3zrWGT3mCqC7Tc9Xs2tYcBzLYrPVOMwyn88SWPhbJdc+b04KZLUf1g5ZwVPej9dPYl5/ifFmBEa2hdA/FrK6TKT0N7wvhhSNxRN3f+v1LHZtW6I7VZVoedtxtx1Q7zTCczl8wNijNde/WMn3B1OKFwfZB3VfVT2Nft7etGJ8SraF0j2CLDp7oy3Y+FkfU/cWaLhOL5yySpS+zY8atV0ZUzFDZhuF0vvVf6J5D64/02QU0wlj3gO4r66ex746LXJSCiaI1tO7hN0qEkRv+dZcz2Z8ztBzE1d1X950L3eTL8p5U/hdlXhZVoXCaYTidtzv+QvduHxnPbGmNJ9qtXtR9df0M1fb94IzJIMQhWkPrHh7P+ftYcud34u05hb4ohoN48a1qjdCTHjK+jsPN+jL9JmGBaqcZhtPZX7/RPe9y4IVgGrREMdGS7uvr11NtX94wV4rMitZQu8fNta/bWbNudq/uIb4/bXPvqjJ0wJd9GVdXbQTL0vWxPXG4WV0m79Dq6SZ8L/1xBnEIOVS2YTidAyBj7pJ0z/tx3+wf8xdF8b2C7hX1I2rt60qWG17RGkMmEt3Duxcy3k66WNvB+1eLAa0OvnvxHEe9ERxN+I6At7C315bpY3eb97AculjtNMNw+u/jOR380NhZJHUd8RYyWfea+nmq7OtOk8vnhkVraN1zRROZjGjEfxroTgoS7eF+OjaQ1gghYXccZlKW6dZqrpO4BF2udpphOJ0a0eG3G3eIuueL/b3L+89F3avqF1Jj3wcu/D58MhjRGkr3uEqlPJ66te8gA+W7KDxUpWRsqzVCzJr76kgAyjK5Hf1MRx90vdpphuF0SiwHvAlR927Vy/ibNhEnZ7BF3avqF1NhX3foRHKTaA2le6i3eo6nHPNNe+KxfU8abBAgryULbEojZFxye+Pje8oyOVyQxyTs9XqnGQbTeWo/NBzskXXP4xUzs6URU7JsI+leV7+UcfuSRdOb7RGtoXMPTWue4ze+Pe7OQfU+UFEOZHJtk5m/zggCH9wO+I0aujJ5/JW/bI4Sqp1mGEznr5IngQGy7nkWtVm6aH4ywpV0r6tfxqh9/RtV8r1sojV07qH+pP/2dfNt5uN3px/XMzxpLY9c+clIfK4zggTH0vy8QVcmx/jyrooSqp1mGEznaa04BwyRde+We79532S6wU3Sva5+OaP2dT+Vnp9AE62hc4+t82mPVZXhXaHCM2/h/SWp+XVGkOAS/DfryqQryZEOg02od5qB0/8J+wR5mCN8VUJB99y6fHJMM+04JN3r6pczbl8XZyy9VbHehLl77Ai6sD5wergpK63c8QQpndLpjCBic/1a96QV4UypTah3moHT56vcEGyDsV/lLOrevUGJmvvszWKS7nX1E6BsA/Z1y6fpxEW0ls49tr0U7v48cM+8PGfj3dKB9Sw6I0jwUPe34xzhtQIWPtRa7TQDpwtN1JLnZaW/9RR07wVmyTYjSrrX1S+nwr7+5ZhJWaK1dO6hccLolOhUcERHvEN3CjOL4OmMIMGBND+41JXJR4zS8S9vfap3moHTO34SpXFzPz7MKeqeNUhk8ztJ97r65dTY170kN9mhJlpL5x7W1fPY3o4T4Rp84U0CH27FLW3ulUZ4db+S4aFcQU+oK5Ojg8mhVyeLeqcZON3wGI3x3WtmKraMl3TvhpM9+WRP0r2mfr+2r6tc/FIh0Vo697gtQPPNavXc76+YNXU/CnQcvEtWcTu0bp2J85Gtyggm82tSY7ZL4FadYV0bGkVZ/Np+vdMMnN5zH7SxLhC+qGi4irrnoGRP3rNKulfUbw/7ugWuaHgnWmvIhLl7XEAk5fHlhC+EDbgNtlGsvri/W26D37oR3jCmMkIvh7fXoC9dOv8FEtMZ1i2DBj9GcssCMlQ7zcDpxAvd1pUfmQ/t1WaKuuc3hxiyWa2se0X99rGvKzF8GsWcSve4zc4C9+cw7I9v8L4/yuZG/QbpeILKCCyHx3bbdIPkh8ZvIAmn00rD+p70x5TaVYRX9i3VTjNwuqPvm4ODTtJLNTOKuuf7NwgRBFH39fXbx75+91jQ24s5le65aIIGNeNf1Iudhu+BJ7NjIy2zqYyQicoRvc5Ga9jo4QxaQmqjq51m4PQ2KtSzqZqelXXPKR2Cx0Xd19dvL/u6OwvyijmHTCi55+KqNNQxLM5gsHMT7KDIeMy75Q6VEXi5JuMtClZoDRv/UpVjR5HraqcZXPo6EJgnvtEiZd3zm7qF0FiHrPvq+u1nXzckyhuqahNK7pEt6VjUmfSgrKMTDhFPcv+uM4LvsiP2PW8lCePtm1dsqp1m8OnLeDTRM/weMs+A7p26pKGtrPv6+u1nX+d8d9tiTqV7+KD7mwnj9PGctl2tgie0tFR6VBrxzP5k77rZCj3KYv/ztbdRfNDwaqbg9r/VTjOE6dnveLqfcx5jQPe8vVL4EYii7uvrt5d93UsD3b2JOXXu4TWxtMm49fGSfMfdKbgJfhXb8ii9jIKxT7PYWVHrE68HbH/izngT/35Nj7bMjlmojMWPHTvba3ExA2UbIqdGv9vMhdawJhMmB0V6aFQuhoWoMwj2DDPV9dvHvjd02xv3TIo5Ve6h6gpvXXe/Czd6nOFYPHz9rMyvnZkfz3vfjnRDzWU7KyxDPDR3bZOb5+Puc2Vc9rb62cla0pfZOW33Y36873r1MnNua3btNjX4QNkdaWP2/bLqWsHV6udb1Rsvm+/it9x2NZgJoTHDQ3fHjWyT2vrtY9+leS3VpY0aWcScCvfwBpdswbPDHXIsegMci6FOHOihSZK864vnOlIzBo4KdD8pPJuRlc3ToPM5h/K/BbqfFFJ2YRtyvlUUnAjoflJoM6gwUTdw2DWfooAjA91PCm13Kxxfpajnad8FDgzQ/aTw/lNxfM/7F+RJLzgm0P2k8KkO6QWU7tdWzmI78v8c6H5S+NUp89ds+eOKF6fPZtnq/wx0Py1uT9rKr7YZrnZuKRzRnDMAup8W90KCjs/2rum5bIMtmsIeJnB0oPuJcQcYC0D2ZwF0PzWDwl+cw0FDAN0fgIHfKPrEitWZAN0fgBlvvIxYPGNGez5Q4wSXTMpDG56w6rj++YriO+DEXJlXVe8K2+PBHlw1d/aUYbttoHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8fLi7+A/PDtmuDI3I1AAAAAElFTkSuQmCC"}}},{"cell_type":"code","source":"def apply_unsharp_mask(image, kernel_size=(5, 5), sigma=1.0, amount=1.5, threshold=0):\n    \"\"\"\n    Terapkan unsharp masking ke citra grayscale.\n    \n    Parameters:\n    - kernel_size: ukuran kernel Gaussian blur\n    - sigma: deviasi standar untuk Gaussian blur\n    - amount: seberapa banyak detail ditambahkan kembali (penguatan tepi)\n    - threshold: nilai minimum perubahan untuk diterapkan (hindari noise)\n    \"\"\"\n    # Pastikan gambar dalam format uint8\n    if image.dtype != np.uint8:\n        image = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)\n\n    # Blur citra\n    blurred = cv2.GaussianBlur(image, kernel_size, sigma)\n\n    # Hitung mask (detail edges)\n    sharpened = float(amount + 1) * image - float(amount) * blurred\n    sharpened = np.maximum(sharpened, 0)\n    sharpened = np.minimum(sharpened, 255)\n    sharpened = sharpened.round().astype(np.uint8)\n\n    if threshold > 0:\n        # Terapkan thresholding agar hanya bagian signifikan yang diasah\n        low_contrast_mask = np.abs(image - blurred) < threshold\n        np.copyto(sharpened, image, where=low_contrast_mask)\n\n    return sharpened\n\ndf_dicom_flair['unsharp_masking'] = df_dicom_flair['enhancement'].apply(\n    lambda img: apply_unsharp_mask(img, kernel_size=(5, 5), sigma=1.0, amount=1.5, threshold=0)\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:51:16.959748Z","iopub.execute_input":"2025-05-19T12:51:16.960211Z","iopub.status.idle":"2025-05-19T12:51:40.519821Z","shell.execute_reply.started":"2025-05-19T12:51:16.960178Z","shell.execute_reply":"2025-05-19T12:51:40.518692Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"show_images_side_by_side(df_dicom_flair, 'enhancement', 'unsharp_masking', index=1000)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:51:40.521458Z","iopub.execute_input":"2025-05-19T12:51:40.521750Z","iopub.status.idle":"2025-05-19T12:51:40.842542Z","shell.execute_reply.started":"2025-05-19T12:51:40.521725Z","shell.execute_reply":"2025-05-19T12:51:40.841363Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Segmentation","metadata":{}},{"cell_type":"code","source":"# def simple_brain_segmentation(image):\n#     \"\"\"\n#     Segmentasi sederhana gambar CT scan otak dengan thresholding dan operasi morfologi.\n    \n#     image: gambar grayscale (uint8)\n#     return: gambar hasil segmentasi (mask biner)\n#     \"\"\"\n#     # Normalisasi dan pastikan uint8\n#     if image.dtype != np.uint8:\n#         image = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)\n\n#     # Blur untuk mengurangi noise\n#     blurred = cv2.GaussianBlur(image, (5, 5), 0)\n\n#     # Otsu Thresholding (otomatis)\n#     _, thresh = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)\n\n#     # Invers jika latar belakang lebih terang\n#     if np.mean(image[thresh == 255]) > np.mean(image[thresh == 0]):\n#         thresh = cv2.bitwise_not(thresh)\n\n#     # Operasi morfologi untuk mengisi lubang dan menghilangkan noise kecil\n#     kernel = np.ones((3, 3), np.uint8)\n#     cleaned = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)\n#     cleaned = cv2.morphologyEx(cleaned, cv2.MORPH_OPEN, kernel, iterations=1)\n\n#     return cleaned\n\n# df_dicom_flair['segmentation'] = df_dicom_flair['unsharp_masking'].apply(simple_brain_segmentation)\n\n# def crop_and_resize_brain(image, mask, output_size=(64, 64)):\n#     \"\"\"\n#     Crop bagian otak dari image berdasarkan mask, lalu resize ke ukuran output_size.\n\n#     Parameters:\n#     - image: numpy array gambar grayscale (2D)\n#     - mask: binary mask (2D), hasil segmentasi\n#     - output_size: tuple ukuran (width, height)\n\n#     Returns:\n#     - image hasil crop & resize\n#     \"\"\"\n#     # Cari koordinat non-zero (bagian otak)\n#     coords = cv2.findNonZero(mask)\n#     if coords is None:\n#         # Jika tidak ada area otak terdeteksi, kembalikan hasil resize langsung\n#         resized = cv2.resize(image, output_size, interpolation=cv2.INTER_LINEAR)\n#         return resized\n    \n#     # Hitung bounding rectangle dari area otak\n#     x, y, w, h = cv2.boundingRect(coords)\n    \n#     # Crop area penting\n#     cropped = image[y:y+h, x:x+w]\n\n#     # Resize ke ukuran tetap\n#     resized = cv2.resize(cropped, output_size, interpolation=cv2.INTER_LINEAR)\n\n#     return resized\n\n# df_dicom_flair['cropped'] = df_dicom_flair.apply(\n#     lambda row: crop_and_resize_brain(row['unsharp_masking'], row['segmentation']), axis=1\n# )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:24:39.718923Z","iopub.execute_input":"2025-05-19T12:24:39.719439Z","iopub.status.idle":"2025-05-19T12:25:16.075036Z","shell.execute_reply.started":"2025-05-19T12:24:39.719403Z","shell.execute_reply":"2025-05-19T12:25:16.073507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# show_images_side_by_side(df_dicom_flair, 'unsharp_masking', 'cropped', index=1000)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:25:16.629147Z","iopub.execute_input":"2025-05-19T12:25:16.629662Z","iopub.status.idle":"2025-05-19T12:25:16.904811Z","shell.execute_reply.started":"2025-05-19T12:25:16.629625Z","shell.execute_reply":"2025-05-19T12:25:16.903239Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Interpolation","metadata":{}},{"cell_type":"code","source":"import cv2\nimport numpy as np\n\ndef apply_interpolation(image, target_size, method=cv2.INTER_LANCZOS4):\n    \"\"\"\n    Interpolasi gambar ke ukuran target menggunakan metode tertentu.\n    \n    Parameters:\n    - image: array gambar input (grayscale)\n    - target_size: tuple (width, height)\n    - method: metode interpolasi dari OpenCV\n    \"\"\"\n    if image.dtype != np.uint8:\n        image = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)\n    \n    resized = cv2.resize(image, target_size, interpolation=method)\n    return resized\n\ndf_dicom_flair['interpolation'] = df_dicom_flair['unsharp_masking'].apply(\n    lambda img: apply_interpolation(img, target_size=(256, 256), method=cv2.INTER_LANCZOS4)\n)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:51:52.615897Z","iopub.execute_input":"2025-05-19T12:51:52.616214Z","iopub.status.idle":"2025-05-19T12:51:54.266700Z","shell.execute_reply.started":"2025-05-19T12:51:52.616193Z","shell.execute_reply":"2025-05-19T12:51:54.264979Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"show_images_side_by_side(df_dicom_flair, 'unsharp_masking', 'interpolation', index=1000)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:51:59.937607Z","iopub.execute_input":"2025-05-19T12:51:59.937952Z","iopub.status.idle":"2025-05-19T12:52:00.309984Z","shell.execute_reply.started":"2025-05-19T12:51:59.937927Z","shell.execute_reply":"2025-05-19T12:52:00.308365Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Normalization","metadata":{}},{"cell_type":"code","source":"import numpy as np\n\ndef normalize_image(image):\n    image = image.astype(np.float32)\n    min_val = np.min(image)\n    max_val = np.max(image)\n    if max_val - min_val == 0:\n        return np.zeros_like(image)  # menghindari pembagian nol\n    return (image - min_val) / (max_val - min_val)\n\ndf_dicom_flair['normalized'] = df_dicom_flair['interpolation'].apply(normalize_image)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:52:12.415540Z","iopub.execute_input":"2025-05-19T12:52:12.415955Z","iopub.status.idle":"2025-05-19T12:52:23.879610Z","shell.execute_reply.started":"2025-05-19T12:52:12.415927Z","shell.execute_reply":"2025-05-19T12:52:23.878135Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"show_images_side_by_side(df_dicom_flair, 'interpolation', 'normalized', index=1000)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:52:23.881087Z","iopub.execute_input":"2025-05-19T12:52:23.881450Z","iopub.status.idle":"2025-05-19T12:52:24.201921Z","shell.execute_reply.started":"2025-05-19T12:52:23.881413Z","shell.execute_reply":"2025-05-19T12:52:24.200188Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_dicom_flair","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-19T12:52:29.077040Z","iopub.execute_input":"2025-05-19T12:52:29.077515Z","iopub.status.idle":"2025-05-19T12:52:32.745057Z","shell.execute_reply.started":"2025-05-19T12:52:29.077478Z","shell.execute_reply":"2025-05-19T12:52:32.743949Z"}},"outputs":[],"execution_count":null}]}