ダイアログを使って複数選択した画像から任意の画像を表示する方法

Python

リストで取得したファイルから、ある画像を表示する方法

5回前の記事でCT画像のWW、WLをスライダーを使って調整の記事を書きました。

そして、前回、前々回ではファイルを複数、もしくはフォルダごとに選択する方法を書きましたが、その際、選択したファイル名を表示するに留まり、WW,WLの調整の記事にしませんでした。

その理由は、複数選択した変数名をそのまま処理に回すとエラーが出てしまいまうからです。

例えば、画像を表示しようとしたときの命令文

plt.imshow(……………)

で指定するファイル名は一つでなければいけないのですが、変数をそのまま渡すことは、複数のファイル名を指定していることになってしまいます。


CT画像のWW、WLをスライダーを使って調整で示したコードのファイル選択部分をダイアログを使って、ファイルを複数選択する。 に変更してみました。


# -*- coding: utf-8 -*-

import pydicom
from matplotlib import pyplot as plt
from matplotlib.widgets import Slider

import tkinter  
from tkinter import filedialog as tkFileDialog

def fileselect():
    root = tkinter.Tk()  
    root.withdraw()  

    fTyp = [('', '*')]  
    iDir = 'C:/Desktop'  

    filenames = tkFileDialog.askopenfilenames(filetypes=fTyp, initialdir=iDir)

    return filenames  

fname = fileselect()  

ds = pydicom.dcmread(fname)

low = -140  
high = 260  

fig = plt.figure(figsize=(5, 6))  

img = plt.imshow(ds.pixel_array, cmap=plt.cm.bone, vmin=low, vmax=high)

wl_slider_pos = plt.axes([0.1, 0.08, 0.8, 0.03])
ww_slider_pos = plt.axes([0.1, 0.01, 0.8, 0.03])

wl_slider = Slider(wl_slider_pos, 'wl', 0, 500, valinit=175)
ww_slider = Slider(ww_slider_pos, 'ww', 0, 2000, valinit=350)

def update(slider_val):  
    ww = ww_slider.val
    wl = wl_slider.val

    low = int(wl - ww / 2)
    high = int(wl + ww / 2)

    img.set_clim([low, high])
    fig.canvas.update()

wl_slider.on_changed(update)
ww_slider.on_changed(update)

plt.show()  

これを実行すると

’tuple’型のものは指定できませんと怒られてしまいます。

では、どうしたらいいのでしょうか?

それは、一つ一つ取り出してあげればいいだけです。

その方法は変数の後ろに[]を付けて中に何番目のデータか指定してあげればいいです。

例えば、初めのデータを表示したければ、上記コードの24行目の変数を

fname ⇒  fname[0]

のように、変数の初めのファイルに指定してあげれば表示することができます。

(変数に入れた複数のデータは0からカウントしていきます。なので一番初めのファイルは番号0となります。)

i番目の画像を表示したい場合はi-1を指定してあげればいいわけです。


# -*- coding: utf-8 -*-

import pydicom
from matplotlib import pyplot as plt
from matplotlib.widgets import Slider

import tkinter  
from tkinter import filedialog as tkFileDialog

def fileselect():
    root = tkinter.Tk()  
    root.withdraw()  

    fTyp = [('', '*')]  
    iDir = 'C:/Desktop'  

    filenames = tkFileDialog.askopenfilenames(filetypes=fTyp, initialdir=iDir)

    return filenames  

fname = fileselect()  

ds = pydicom.dcmread(fname[0])

low = -140  
high = 260  

fig = plt.figure(figsize=(5, 6))  

img = plt.imshow(ds.pixel_array, cmap=plt.cm.bone, vmin=low, vmax=high)

wl_slider_pos = plt.axes([0.1, 0.08, 0.8, 0.03])
ww_slider_pos = plt.axes([0.1, 0.01, 0.8, 0.03])

wl_slider = Slider(wl_slider_pos, 'wl', 0, 500, valinit=175)
ww_slider = Slider(ww_slider_pos, 'ww', 0, 2000, valinit=350)

def update(slider_val):  
    ww = ww_slider.val
    wl = wl_slider.val

    low = int(wl - ww / 2)
    high = int(wl + ww / 2)

    img.set_clim([low, high])
    fig.canvas.update()

wl_slider.on_changed(update)
ww_slider.on_changed(update)

plt.show()  

修正したコードです。

せっかく、複数選択したのに指定した画像しか表示できないのでは余計め面倒になってしまいました。。。。。


次回は、マウスのホイールを使って画像を変更していく方法をやってみたいと思います。

タイトルとURLをコピーしました