将数组显示为图像Tkinter

时间:2018-07-16 19:55:35

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

我正在尝试使用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()

任何建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

我找到了解决大多数问题的方法,但是这样做却造成了一个新问题。现在,当我运行程序时,我将创建一个额外的窗口。这是我的更改:

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()

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