我正在尝试用python创建DICOM查看器。我想使用滚动鼠标跳过图像。它工作得很好,但是过程非常缓慢,特别是如果我想在全屏模式下进行的话。我知道matplotlibt并不是执行它的更快的库。我知道我可能可以使用Pillow的fortbyte函数,但将来我想使用Navigation工具栏。我正在尝试通过matplotlibt进行工作,但是无法正常工作。有人有什么想法可以提高所呈现图像的速度吗?下面我发布了我的代码。预先感谢。
import tkinter
import pydicom as dicom
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from matplotlib import *
import time
pathDir = 'C:/DICOM/'
images = os.listdir(pathDir)
slices = [dicom.read_file(pathDir + s, force=True) for s in images]
rows = int(slices[0].Rows)
cols = int(slices[0].Columns)
RS = slices[0].RescaleSlope
RI = slices[0].RescaleIntercept
WC = slices[0].WindowCenter
WW = slices[0].WindowWidth
lv = (WC - WW) / 2
hv = (WC + WW) / 2
imageDim = np.zeros((rows, cols, len(slices)), 'int')
ii = int
for ii in range(len(slices)):
imageDim[:, :, ii] = slices[ii].pixel_array * RS + RI
root = tkinter.Tk()
# root.wm_title("Try MouseWheel")
# root.geometry("1920x1080")
root.resizable(width=True, height=True)
slide = 128
minInt = np.min(imageDim)
maxInt = np.max(imageDim)
# print(minInt, maxInt)
def main_loop():
fig = Figure()
ax = fig.subplots()
ax.imshow(imageDim[:, :, slide], cmap='gray', vmin=minInt, vmax=maxInt)
fig.canvas = FigureCanvasTkAgg(fig, master=root)
fig.canvas.draw()
fig.canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand='true')
fig.canvas.mpl_connect('scroll_event', mouse_wheel)
def mouse_wheel(event):
global slide
fig = event.canvas.figure
ax = fig.axes[0]
if event.step < 0:
slide += event.step
if event.step > 0:
slide += event.step
tstart = time.time()
ax.imshow(imageDim[:, :, int(slide)], cmap='gray', vmin=minInt, vmax=maxInt)
fig.canvas.draw()
print('FPS:', 1 / (time.time() - tstart))
main_loop()
root.mainloop()
似乎添加ax.clear()对视图速度已经有很大帮助。但是,如果有人有更好的看法来改进此代码,我将很高兴听到它。
def mouse_wheel(event):
global slide
fig = event.canvas.figure
ax = fig.axes[0]
if event.step < 0:
slide += event.step
if event.step > 0:
slide += event.step
tstart = time.time()
ax.clear()
ax.imshow(imageDim[:, :, int(slide)], cmap='gray', vmin=minInt, vmax=maxInt)
fig.canvas.draw()
print('FPS:', 1 / (time.time() - tstart))
谢谢,但是我认为我是这样做的?我对子图轴进行了签名。是不正确的?我应该怎么做?