Как улучшить скорость построения DICOM в matplotlib - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь создать программу просмотра DICOM в python. Я хотел бы использовать мышь с прокруткой, чтобы пропустить изображения. Это работает довольно хорошо, но процесс очень медленный, особенно если я хотел бы сделать это в полноэкранном режиме. Я знаю, что matplotlibt не самая быстрая библиотека для этого. Я знаю, что мог бы использовать функцию fortbyte из Pillow, но я хотел бы использовать панель навигации в будущем. Я пытался заставить себя работать над 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()

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Спасибо, а я думал, что так и сделал? топор я подписал ось субплота. Не является правильным? Как мне это сделать?

0 голосов
/ 05 апреля 2020

Кажется, что добавление 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))
...