ご覧いただきありがとうございます。
16bit画像であるDICOM画像を複数枚numpy配列に取り込み
matplotlibで表示、マウスホイールにて画像切り替えを行っています。
画像比較の為、画像を2つ表示し、片方はseabornにて表示しています。
切り替えの際、2~3枚目までの画像変更時はいいのですが
切り替えを繰り返していくうちにどんどん反応が鈍くなっていきます。
PCのスペックが原因かと思ったのですが、他のハイスペックPCでも同様の結果となります。
1枚の画像サイズとしては(512,512)です。
グレイスケール画像になります。
これを3次元配列として
(画像番号,512,512)
としてnumpy配列に取り込んで表示しています。
3次元配列だから遅いのかと思い、2次元配列でスライシングの方法も試してみたのですが
改善しませんでした。
他の方法を思いつかない為質問させていただきました。
質問内容以外にも、改善点がありましたら遠慮なくご指摘いただければ幸いです。
よろしくお願いいたします。
python
1import tkinter 2import glob 3from tkinter import filedialog as tkFileDialog #python3 4import numpy as np 5import pydicom 6import matplotlib.pyplot as plt 7import seaborn as sns 8from tqdm import tqdm 9 10class Pixarr: 11 def __init__(self, filenames, row, columns): 12 self.filenames = filenames 13 self.row = row 14 self.columns = columns 15 self.arr = np.zeros((len(self.filenames), row, columns), dtype='int16') 16 17 for i in tqdm((range(len(filenames)))): 18 if len(filenames) == 1: 19 dcm = pydicom.dcmread(filenames[i]) 20 self.arr = dcm.pixel_array 21 else: 22 for i in range(len(filenames)): 23 dcm = pydicom.dcmread(filenames[i]) 24 img_no = dcm[0x0020, 0x0013].value 25 self.arr[img_no - 1] = dcm.pixel_array 26 27 try: 28 wl = dcm[0x0028, 0x1050].value 29 ww = dcm[0x0028, 0x1051].value 30 # self.arr = self.arr + 1024 31 except: 32 wl = dcm[0x0028, 0x1050].value[0] 33 ww = dcm[0x0028, 0x1051].value[0] 34 35 self.ww_low = wl - ww // 2 36 self.ww_high = wl + ww // 2 37 38 39def wheel_scroll(event): 40 global sl, arr_thre, f0, x, y 41 42 if event.button == 'down': 43 sl += 1 44 if sl > len(f0.filenames) - 1: 45 sl = 0 46 47 if event.button == 'up': 48 sl -= 1 49 if sl < 0: 50 sl = len(f0.filenames) - 1 51 52 show_img() 53 54 55def show_img(): 56 global fig, ax1, ax2, f0,sl 57 58 ax1.imshow(f0.arr[sl], cmap='bone', vmin=f0.ww_low, vmax=f0.ww_high) 59 ax2 = sns.heatmap(f0.arr[sl],cmap='jet', cbar=None, vmin=f0.ww_low, vmax=f0.ww_high) 60 fig.canvas.mpl_connect('scroll_event', wheel_scroll) 61 62 plt.show() 63 64def directory(): 65 root = tkinter.Tk() 66 root.withdraw() 67 fTyp = [('', '*')] 68 iDir = 'C:/Desktop' 69 70 dirname = tkFileDialog.askdirectory(initialdir=iDir) 71 filenames = glob.glob(dirname + "/*") 72 return filenames 73 74def main(): 75 global fig, ax1, ax2, f0, sl 76 77 filenames = directory() 78 dcm = pydicom.dcmread(filenames[0]) 79 row, columns = dcm.pixel_array.shape[0], dcm.pixel_array.shape[1] 80 f0 = Pixarr(filenames, row, columns) 81 82 sl= 0 83 84 fig = plt.figure(figsize=(14, 7)) 85 ax1 = fig.add_subplot(1, 2, 1) 86 ax2 = fig.add_subplot(1, 2, 2) 87 88 ax1.axes.xaxis.set_visible(False), ax1.axes.yaxis.set_visible(False) 89 ax2.axes.xaxis.set_visible(False), ax2.axes.yaxis.set_visible(False) 90 91 show_img() 92 93if __name__ == '__main__': 94 main()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/09 00:18
2021/10/09 09:00