{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":24800,"databundleVersionId":1831594,"sourceType":"competition"}],"dockerImageVersionId":31153,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pydicom\nimport numpy as np\nfrom PIL import Image\nimport os\nfrom pathlib import Path\nfrom concurrent.futures import ProcessPoolExecutor\n\ndicom_dir = '/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/train'\noutput_dir = '/kaggle/working/train'\nos.makedirs(output_dir, exist_ok=True)\n\ndef convert_dicom_to_png(dicom_file):\n    try:\n        ds = pydicom.dcmread(dicom_file, stop_before_pixels=False)  # vẫn đọc pixel data\n        arr = ds.pixel_array.astype(np.float32)\n        arr -= arr.min()\n        arr /= arr.max()\n        arr = (arr * 255).astype(np.uint8)\n\n        Image.fromarray(arr).save(os.path.join(output_dir, Path(dicom_file).stem + '.png'))\n        return dicom_file\n    except Exception as e:\n        return f\"Lỗi: {dicom_file} -> {e}\"\n\n# Duyệt danh sách file\ndicom_files = list(Path(dicom_dir).rglob('*.dicom'))\n\n# Dùng đa tiến trình (8 tiến trình thường nhanh nhất trên Kaggle)\nwith ProcessPoolExecutor(max_workers=8) as ex:\n    for result in ex.map(convert_dicom_to_png, dicom_files):\n        print(result)\n\nprint(\"✅ Hoàn thành!\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-10-24T04:44:52.115697Z","iopub.execute_input":"2025-10-24T04:44:52.115938Z","execution_failed":"2025-10-24T04:44:54.487Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pydicom\nimport numpy as np\nfrom PIL import Image\nimport os\nfrom pathlib import Path\nfrom concurrent.futures import ProcessPoolExecutor\n\ndicom_dir = '/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/test'\noutput_dir = '/kaggle/working/test'\nos.makedirs(output_dir, exist_ok=True)\n\ndef convert_dicom_to_png(dicom_file):\n    try:\n        ds = pydicom.dcmread(dicom_file, stop_before_pixels=False)  # vẫn đọc pixel data\n        arr = ds.pixel_array.astype(np.float32)\n        arr -= arr.min()\n        arr /= arr.max()\n        arr = (arr * 255).astype(np.uint8)\n\n        Image.fromarray(arr).save(os.path.join(output_dir, Path(dicom_file).stem + '.png'))\n        return dicom_file\n    except Exception as e:\n        return f\"Lỗi: {dicom_file} -> {e}\"\n\n# Duyệt danh sách file\ndicom_files = list(Path(dicom_dir).rglob('*.dicom'))\n\n# Dùng đa tiến trình (8 tiến trình thường nhanh nhất trên Kaggle)\nwith ProcessPoolExecutor(max_workers=8) as ex:\n    for result in ex.map(convert_dicom_to_png, dicom_files):\n        print(result)\n\nprint(\"✅ Hoàn thành!\")","metadata":{"trusted":true,"execution":{"execution_failed":"2025-10-24T04:44:54.487Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}