{
  "id": 520264,
  "title": "The easiest way to view DICOM image folders in GUI",
  "url": "/competitions/rsna-2024-lumbar-spine-degenerative-classification/discussion/520264",
  "author_name": "",
  "post_date": "2024-07-15T11:06:23.650577800Z",
  "votes": 2,
  "comment_count": 1,
  "views": 0,
  "content": "<p>I tried some tools such as mango, but somehow it gives me multiple slices concated together on one view. I don't want to debug because this should be a very simple concept. So I ask AI. Uses only tkinter, matplotlib, and pydicom. Just run the following code, the name for each view might be incorrect, but it doesn't affect viewing the image:</p>\n<pre><code> os\n tkinter  tk\n tkinter  filedialog\n pydicom\n numpy  np\n matplotlib.pyplot  plt\n matplotlib.backends.backend_tkagg  FigureCanvasTkAgg\n\n :\n     ():\n        self.master = master\n        self.master.title()\n        self.master.geometry()\n\n        self.volume = \n        self.current_axial = \n        self.current_sagittal = \n        self.current_coronal = \n\n        self.setup_ui()\n\n     ():\n        \n        self.load_button = tk.Button(self.master, text=, command=self.load_dicom_folder)\n        self.load_button.pack(pady=)\n\n        \n        self.fig, (self.ax1, self.ax2, self.ax3) = plt.subplots(, , figsize=(, ))\n        self.canvas = FigureCanvasTkAgg(self.fig, master=self.master)\n        self.canvas.draw()\n        self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=)\n\n        \n        self.axial_slider = tk.Scale(self.master, from_=, to=, orient=tk.HORIZONTAL, label=, command=self.update_axial)\n        self.axial_slider.pack(side=tk.LEFT, fill=tk.X, expand=)\n\n        self.sagittal_slider = tk.Scale(self.master, from_=, to=, orient=tk.HORIZONTAL, label=, command=self.update_sagittal)\n        self.sagittal_slider.pack(side=tk.LEFT, fill=tk.X, expand=)\n\n        self.coronal_slider = tk.Scale(self.master, from_=, to=, orient=tk.HORIZONTAL, label=, command=self.update_coronal)\n        self.coronal_slider.pack(side=tk.LEFT, fill=tk.X, expand=)\n\n     ():\n        folder_path = filedialog.askdirectory(title=)\n          folder_path:\n            \n\n        dicom_files = [f  f  os.listdir(folder_path)  f.endswith()]\n        dicom_files.sort(key= x: (x.split()[]))  \n\n        slices = [pydicom.dcmread(os.path.join(folder_path, f))  f  dicom_files]\n        self.volume = np.stack([s.pixel_array  s  slices])\n\n        self.axial_slider.config(to=self.volume.shape[] - )\n        self.sagittal_slider.config(to=self.volume.shape[] - )\n        self.coronal_slider.config(to=self.volume.shape[] - )\n\n        self.update_all_views()\n\n     ():\n        self.current_axial = (value)\n        self.update_all_views()\n\n     ():\n        self.current_sagittal = (value)\n        self.update_all_views()\n\n     ():\n        self.current_coronal = (value)\n        self.update_all_views()\n\n     ():\n         self.volume  :\n            \n\n        self.ax1.clear()\n        self.ax2.clear()\n        self.ax3.clear()\n\n        self.ax1.imshow(self.volume[self.current_axial, :, :], cmap=)\n        self.ax1.set_title()\n        self.ax1.axis()\n\n        self.ax2.imshow(self.volume[:, self.current_sagittal, :], cmap=)\n        self.ax2.set_title()\n        self.ax2.axis()\n\n        self.ax3.imshow(self.volume[:, :, self.current_coronal], cmap=)\n        self.ax3.set_title()\n        self.ax3.axis()\n\n        self.canvas.draw()\n\n __name__ == :\n    root = tk.Tk()\n    app = DICOM3DViewer(root)\n    root.mainloop()\n</code></pre>\n<p>Example:</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F15806223%2Fc0260a56b13c7530db1b106100a1cf5f%2FScreenshot%202024-07-15%20at%2019.07.43.png?generation=1721041696055066&amp;alt=media\"></p>",
  "messages": [
    {
      "id": "2922638",
      "postDate": "07/15/2024 11:06:23",
      "content": "<p>I tried some tools such as mango, but somehow it gives me multiple slices concated together on one view. I don't want to debug because this should be a very simple concept. So I ask AI. Uses only tkinter, matplotlib, and pydicom. Just run the following code, the name for each view might be incorrect, but it doesn't affect viewing the image:</p>\n<pre><code> os\n tkinter  tk\n tkinter  filedialog\n pydicom\n numpy  np\n matplotlib.pyplot  plt\n matplotlib.backends.backend_tkagg  FigureCanvasTkAgg\n\n :\n     ():\n        self.master = master\n        self.master.title()\n        self.master.geometry()\n\n        self.volume = \n        self.current_axial = \n        self.current_sagittal = \n        self.current_coronal = \n\n        self.setup_ui()\n\n     ():\n        \n        self.load_button = tk.Button(self.master, text=, command=self.load_dicom_folder)\n        self.load_button.pack(pady=)\n\n        \n        self.fig, (self.ax1, self.ax2, self.ax3) = plt.subplots(, , figsize=(, ))\n        self.canvas = FigureCanvasTkAgg(self.fig, master=self.master)\n        self.canvas.draw()\n        self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=)\n\n        \n        self.axial_slider = tk.Scale(self.master, from_=, to=, orient=tk.HORIZONTAL, label=, command=self.update_axial)\n        self.axial_slider.pack(side=tk.LEFT, fill=tk.X, expand=)\n\n        self.sagittal_slider = tk.Scale(self.master, from_=, to=, orient=tk.HORIZONTAL, label=, command=self.update_sagittal)\n        self.sagittal_slider.pack(side=tk.LEFT, fill=tk.X, expand=)\n\n        self.coronal_slider = tk.Scale(self.master, from_=, to=, orient=tk.HORIZONTAL, label=, command=self.update_coronal)\n        self.coronal_slider.pack(side=tk.LEFT, fill=tk.X, expand=)\n\n     ():\n        folder_path = filedialog.askdirectory(title=)\n          folder_path:\n            \n\n        dicom_files = [f  f  os.listdir(folder_path)  f.endswith()]\n        dicom_files.sort(key= x: (x.split()[]))  \n\n        slices = [pydicom.dcmread(os.path.join(folder_path, f))  f  dicom_files]\n        self.volume = np.stack([s.pixel_array  s  slices])\n\n        self.axial_slider.config(to=self.volume.shape[] - )\n        self.sagittal_slider.config(to=self.volume.shape[] - )\n        self.coronal_slider.config(to=self.volume.shape[] - )\n\n        self.update_all_views()\n\n     ():\n        self.current_axial = (value)\n        self.update_all_views()\n\n     ():\n        self.current_sagittal = (value)\n        self.update_all_views()\n\n     ():\n        self.current_coronal = (value)\n        self.update_all_views()\n\n     ():\n         self.volume  :\n            \n\n        self.ax1.clear()\n        self.ax2.clear()\n        self.ax3.clear()\n\n        self.ax1.imshow(self.volume[self.current_axial, :, :], cmap=)\n        self.ax1.set_title()\n        self.ax1.axis()\n\n        self.ax2.imshow(self.volume[:, self.current_sagittal, :], cmap=)\n        self.ax2.set_title()\n        self.ax2.axis()\n\n        self.ax3.imshow(self.volume[:, :, self.current_coronal], cmap=)\n        self.ax3.set_title()\n        self.ax3.axis()\n\n        self.canvas.draw()\n\n __name__ == :\n    root = tk.Tk()\n    app = DICOM3DViewer(root)\n    root.mainloop()\n</code></pre>\n<p>Example:</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F15806223%2Fc0260a56b13c7530db1b106100a1cf5f%2FScreenshot%202024-07-15%20at%2019.07.43.png?generation=1721041696055066&amp;alt=media\"></p>",
      "rawMarkdown": "I tried some tools such as mango, but somehow it gives me multiple slices concated together on one view. I don't want to debug because this should be a very simple concept. So I ask AI. Uses only tkinter, matplotlib, and pydicom. Just run the following code, the name for each view might be incorrect, but it doesn't affect viewing the image:\n\n```\nimport os\nimport tkinter as tk\nfrom tkinter import filedialog\nimport pydicom\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib.backends.backend_tkagg import FigureCanvasTkAgg\n\nclass DICOM3DViewer:\n    def __init__(self, master):\n        self.master = master\n        self.master.title(\"DICOM 3D Viewer\")\n        self.master.geometry(\"1200x800\")\n\n        self.volume = None\n        self.current_axial = 0\n        self.current_sagittal = 0\n        self.current_coronal = 0\n\n        self.setup_ui()\n\n    def setup_ui(self):\n        # Create buttons\n        self.load_button = tk.Button(self.master, text=\"Load DICOM Folder\", command=self.load_dicom_folder)\n        self.load_button.pack(pady=10)\n\n        # Create figure and subplots\n        self.fig, (self.ax1, self.ax2, self.ax3) = plt.subplots(1, 3, figsize=(15, 5))\n        self.canvas = FigureCanvasTkAgg(self.fig, master=self.master)\n        self.canvas.draw()\n        self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)\n\n        # Create sliders\n        self.axial_slider = tk.Scale(self.master, from_=0, to=0, orient=tk.HORIZONTAL, label=\"Axial\", command=self.update_axial)\n        self.axial_slider.pack(side=tk.LEFT, fill=tk.X, expand=1)\n\n        self.sagittal_slider = tk.Scale(self.master, from_=0, to=0, orient=tk.HORIZONTAL, label=\"Sagittal\", command=self.update_sagittal)\n        self.sagittal_slider.pack(side=tk.LEFT, fill=tk.X, expand=1)\n\n        self.coronal_slider = tk.Scale(self.master, from_=0, to=0, orient=tk.HORIZONTAL, label=\"Coronal\", command=self.update_coronal)\n        self.coronal_slider.pack(side=tk.LEFT, fill=tk.X, expand=1)\n\n    def load_dicom_folder(self):\n        folder_path = filedialog.askdirectory(title=\"Select DICOM folder\")\n        if not folder_path:\n            return\n\n        dicom_files = [f for f in os.listdir(folder_path) if f.endswith('.dcm')]\n        dicom_files.sort(key=lambda x: int(x.split('.')[0]))  # Sort by number value\n\n        slices = [pydicom.dcmread(os.path.join(folder_path, f)) for f in dicom_files]\n        self.volume = np.stack([s.pixel_array for s in slices])\n\n        self.axial_slider.config(to=self.volume.shape[0] - 1)\n        self.sagittal_slider.config(to=self.volume.shape[1] - 1)\n        self.coronal_slider.config(to=self.volume.shape[2] - 1)\n\n        self.update_all_views()\n\n    def update_axial(self, value):\n        self.current_axial = int(value)\n        self.update_all_views()\n\n    def update_sagittal(self, value):\n        self.current_sagittal = int(value)\n        self.update_all_views()\n\n    def update_coronal(self, value):\n        self.current_coronal = int(value)\n        self.update_all_views()\n\n    def update_all_views(self):\n        if self.volume is None:\n            return\n\n        self.ax1.clear()\n        self.ax2.clear()\n        self.ax3.clear()\n\n        self.ax1.imshow(self.volume[self.current_axial, :, :], cmap='gray')\n        self.ax1.set_title('Axial')\n        self.ax1.axis('off')\n\n        self.ax2.imshow(self.volume[:, self.current_sagittal, :], cmap='gray')\n        self.ax2.set_title('Sagittal')\n        self.ax2.axis('off')\n\n        self.ax3.imshow(self.volume[:, :, self.current_coronal], cmap='gray')\n        self.ax3.set_title('Coronal')\n        self.ax3.axis('off')\n\n        self.canvas.draw()\n\nif __name__ == \"__main__\":\n    root = tk.Tk()\n    app = DICOM3DViewer(root)\n    root.mainloop()\n```\n\nExample:\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F15806223%2Fc0260a56b13c7530db1b106100a1cf5f%2FScreenshot%202024-07-15%20at%2019.07.43.png?generation=1721041696055066&alt=media)",
      "votes": null
    },
    {
      "id": "2922696",
      "postDate": "07/15/2024 12:16:11",
      "content": "<p>download free dicom viewer software</p>",
      "rawMarkdown": "download free dicom viewer software",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 2922696,
      "author_name": "hengck23",
      "author_url": "",
      "post_date": "07/15/2024 12:16:11",
      "content": "<p>download free dicom viewer software</p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "2922638": "I tried some tools such as mango, but somehow it gives me multiple slices concated together on one view. I don't want to debug because this should be a very simple concept. So I ask AI. Uses only tkinter, matplotlib, and pydicom. Just run the following code, the name for each view might be incorrect, but it doesn't affect viewing the image:\n\n```\nimport os\nimport tkinter as tk\nfrom tkinter import filedialog\nimport pydicom\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib.backends.backend_tkagg import FigureCanvasTkAgg\n\nclass DICOM3DViewer:\n    def __init__(self, master):\n        self.master = master\n        self.master.title(\"DICOM 3D Viewer\")\n        self.master.geometry(\"1200x800\")\n\n        self.volume = None\n        self.current_axial = 0\n        self.current_sagittal = 0\n        self.current_coronal = 0\n\n        self.setup_ui()\n\n    def setup_ui(self):\n        # Create buttons\n        self.load_button = tk.Button(self.master, text=\"Load DICOM Folder\", command=self.load_dicom_folder)\n        self.load_button.pack(pady=10)\n\n        # Create figure and subplots\n        self.fig, (self.ax1, self.ax2, self.ax3) = plt.subplots(1, 3, figsize=(15, 5))\n        self.canvas = FigureCanvasTkAgg(self.fig, master=self.master)\n        self.canvas.draw()\n        self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)\n\n        # Create sliders\n        self.axial_slider = tk.Scale(self.master, from_=0, to=0, orient=tk.HORIZONTAL, label=\"Axial\", command=self.update_axial)\n        self.axial_slider.pack(side=tk.LEFT, fill=tk.X, expand=1)\n\n        self.sagittal_slider = tk.Scale(self.master, from_=0, to=0, orient=tk.HORIZONTAL, label=\"Sagittal\", command=self.update_sagittal)\n        self.sagittal_slider.pack(side=tk.LEFT, fill=tk.X, expand=1)\n\n        self.coronal_slider = tk.Scale(self.master, from_=0, to=0, orient=tk.HORIZONTAL, label=\"Coronal\", command=self.update_coronal)\n        self.coronal_slider.pack(side=tk.LEFT, fill=tk.X, expand=1)\n\n    def load_dicom_folder(self):\n        folder_path = filedialog.askdirectory(title=\"Select DICOM folder\")\n        if not folder_path:\n            return\n\n        dicom_files = [f for f in os.listdir(folder_path) if f.endswith('.dcm')]\n        dicom_files.sort(key=lambda x: int(x.split('.')[0]))  # Sort by number value\n\n        slices = [pydicom.dcmread(os.path.join(folder_path, f)) for f in dicom_files]\n        self.volume = np.stack([s.pixel_array for s in slices])\n\n        self.axial_slider.config(to=self.volume.shape[0] - 1)\n        self.sagittal_slider.config(to=self.volume.shape[1] - 1)\n        self.coronal_slider.config(to=self.volume.shape[2] - 1)\n\n        self.update_all_views()\n\n    def update_axial(self, value):\n        self.current_axial = int(value)\n        self.update_all_views()\n\n    def update_sagittal(self, value):\n        self.current_sagittal = int(value)\n        self.update_all_views()\n\n    def update_coronal(self, value):\n        self.current_coronal = int(value)\n        self.update_all_views()\n\n    def update_all_views(self):\n        if self.volume is None:\n            return\n\n        self.ax1.clear()\n        self.ax2.clear()\n        self.ax3.clear()\n\n        self.ax1.imshow(self.volume[self.current_axial, :, :], cmap='gray')\n        self.ax1.set_title('Axial')\n        self.ax1.axis('off')\n\n        self.ax2.imshow(self.volume[:, self.current_sagittal, :], cmap='gray')\n        self.ax2.set_title('Sagittal')\n        self.ax2.axis('off')\n\n        self.ax3.imshow(self.volume[:, :, self.current_coronal], cmap='gray')\n        self.ax3.set_title('Coronal')\n        self.ax3.axis('off')\n\n        self.canvas.draw()\n\nif __name__ == \"__main__\":\n    root = tk.Tk()\n    app = DICOM3DViewer(root)\n    root.mainloop()\n```\n\nExample:\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F15806223%2Fc0260a56b13c7530db1b106100a1cf5f%2FScreenshot%202024-07-15%20at%2019.07.43.png?generation=1721041696055066&alt=media)",
    "2922696": "download free dicom viewer software"
  },
  "source": "meta"
}