python-3.x - 将数组显示为图像 Tkinter
问题描述
我正在尝试使用 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()
任何建议将不胜感激!
解决方案
我找到了解决我大部分问题的方法,但是这样做又产生了一个新问题。现在,当我运行程序时,我创建了一个额外的窗口。这是我的更改:
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()
如何防止出现这个额外的窗口?
推荐阅读
- ios - 'AFHTTPSessionManager' 没有可见的@interface 声明选择器'dataTaskWithRequest:completionHandler:'
- keyword - ECL 中的 LEFT 和 RIGHT 关键字
- sql - 如何使用 PostgreSQL 中的表中的 IN 获取唯一的最新项目
- python - 是否可以连接两个图表,一个用 matplotlib.pyplot 绘制,另一个用 mplfinance 绘制到同一个图中。例如; 相同的图像
- yaml - 如何在 YAML/Jekyll 中转义 < 和 >?
- mysql - 在 MySQL 8 中使用窗口函数获取不同列的计数
- angular - NgRx - 在路由器转换期间正在调度多个操作
- c# - 我可以在 Unity 中一次获得触摸位置和鼠标位置吗?
- java - Javadoc链接到默认包中的类?
- reactjs - 实现 Formik 但无法使用 react 建立正确的连接