質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.54%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1087閲覧

複数画像データである3次元配列へのアクセスを早くしたい

dendendenjirou

総合スコア40

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/08 22:34

ご覧いただきありがとうございます。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

python - Matplotlibはsavefigとclose()の後にメモリを解放しませんに書かれているメモリ問題でしょう。

ここに書かれている方法で解決しない場合は、複雑になりますがmatplotlib.pyplot のメモリリークの対処法の方で確実に対処できます。

投稿2021/10/08 23:18

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dendendenjirou

2021/10/09 00:18

ppaul様 アドバイスありがとうございます。 画像表示のshow_img()の関数の初めに ax1.cla(),ax2.cla() を記載することでメモリーの開放が確認でき、複数回の画像切り替えを行っても遅延することは無くなりました。 非常に助かりました。ありがとうございます。 ただ、全般的に画像変更が遅くその対処法をもしお知りでしたら 引き続き、ご教授いただければ幸いです。
dendendenjirou

2021/10/09 09:00

ppaul様 その後、再度試したところ非常にサクサク動いてくれるようになっておりました。 非常に助かりました。 また、機会がございましたらご教授のほどよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.54%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。