【问题标题】:Display an array as an image Tkinter将数组显示为图像 Tkinter
【发布时间】:2018-07-16 19:55:34
【问题描述】:

我正在尝试使用 tkinter 显示来自压缩 DICOM 数据数组的图像。我将图像压缩为 8 位 numpy 数组。我知道数组可以可视化,因为我已经使用 cv2 和 matplotlib 对其进行了可视化。以下是我创建数据的方式:

import cv2
import numpy as np
import pydicom #https://pydicom.github.io/pydicom/stable/api_ref.html
import os
import glob
from PIL import Image, ImageTk
import PIL
import tkinter as tk

from pathlib import Path

path = Path("C:/Users/H61972/Desktop/1-1058/DICOM")

os.chdir( path )
os.getcwd()
print(__doc__)


#Get dicom files sorted by filename
def get_dicom(): 
    return glob.glob("**/IM*",recursive=True)#slices

#return one file to be read at a time
def load_image(dicom):
    ds = pydicom.read_file(dicom)
    #print(ds.SliceLocation)
    data = np.array(ds.pixel_array)    

    #data = data - np.min(data)    
    x = np.max(data)/255    
    data = data/x

    data = np.clip(data, 0, 255)

    return data


dicom = get_dicom()

def process_frame():

    global data
    frame = load_image(dicom[10])
    frame = cv2.equalizeHist(frame)
    frame = cv2.blur(frame,(5,5))
    return frame

下面是我正在构建的 Tkinter gui:

class mainWindow():
    def __init__(self):
        self.root = tk.Tk()
        self.frame = tk.Frame(self.root, width=500, height=400)
        self.frame.pack()
        self.canvas = tk.Canvas(self.frame, width=500,height=400)
        self.canvas.place(x=-2,y=-2)
        data= process_frame()
        self.im=Image.frombytes('L', (data.shape[1],data.shape[0]), data.astype('b').tostring())
        self.photo = ImageTk.PhotoImage(image=self.im)
        self.canvas.create_image(0,0,image=self.photo,anchor=tk.NW)
        self.root.update()
        self.root.mainloop()

mainWindow()

任何建议将不胜感激!

【问题讨论】:

  • 对不起,您是在问问题吗?对了,请提供Minimal, Complete, and Verifiable example,其中还包括测试数据,因为我不会研究 DICOM 或尝试猜测它包含什么或以什么格式。
  • 是的,对不起。我一直遇到错误:TclError: image "pyimage_" doesn't exist 我读过其他人发现了这个错误,我尝试了多种方法来防止它,但到目前为止都没有成功。

标签: python-3.x opencv tkinter dicom pydicom


【解决方案1】:

我找到了大部分问题的解决方案,但是这样做又产生了一个新问题。现在,当我运行程序时,我创建了一个额外的窗口。这是我的更改:

class DICOM(tk.Tk):

        def __init__(self, *args, **kwargs):

            tk.Tk.__init__(self, *args, **kwargs)#initialized tkinter


            container = tk.Frame(self)#define our tkinter container     
            container.pack(side ="top", fill="both", expand=True)     
            container.grid_rowconfigure(0,weight=1)
            container.grid_columnconfigure(0,weight=1)


            self.frames = { }

            #for F in (StartPage, Viewer):

            frame = mainWindow(container, self)

            self.frames[mainWindow] = frame

            frame.grid(row =0, column =0, sticky ="nsew")

            self.show_frame(mainWindow)

        def show_frame(self, cont):

            frame = self.frames[cont]
            frame.tkraise()


class mainWindow(tk.Frame):
    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.root = tk.Toplevel(class_=self.controller)
       # self.frame = tk.Frame(self.root)
       # self.frame.pack()
        self.canvas = tk.Canvas(self.root)
        self.canvas.place(x=0,y=0)
        data= process_frame()
        self.im=Image.frombytes('L', (data.shape[1],data.shape[0]), data.astype('b').tostring())
        self.photo = ImageTk.PhotoImage(image=self.im)
        self.canvas.create_image(0,0,image=self.photo,anchor=tk.NW)
        self.root.update()
        #self.root.mainloop()

app = DICOM()
app.geometry("800x800")
app.title("Head CT Volumetric Analysis")
app.config(bg="gray")
app.mainloop()

如何防止出现这个额外的窗口?

【讨论】:

  • mainWindow() 的代码很奇怪。我不完全了解您希望完成的工作。但是,您正在创建一个 Toplevel(),它显示为一个新窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2017-08-26
  • 2021-05-11
  • 2016-12-16
相关资源
最近更新 更多