matplotlib キーイベント

はじめに

プログラムを組んでいて、あるキーを押したらこんな動作を組みたいなと思うことがあったのですが、キーイベントの記事がなかなか見つからなくて苦労したので、今回はそれを書いていこうと思います。


広告
デル株式会社

キーイベントとは

キーイベントとはキーボード上のキーを押したことによって動作を決定することで、例えばF1キーを押すことで、画像のWW,WLを頭部の条件に設定する、F2キーで肺野条件にすることや、シフトキーを押しながらマウスホイールで画像拡大をする等の機能を設定することです。

今回は、簡単なF1キーを押すことで頭部条件、F2キーで肺野条件、F3キーで腹部条件、F4キーで骨条件を表示画像に適応する方法をやってみたいと思います。


広告
HP Directplus -HP公式オンラインストア-

イベント

キーボードのイベントは押された時と、離した時のイベントがあります。

  • key_press_event   : キーボードのキーが押された時
  • key_release_event  : キーボードのキーが離された時

イベントの設定は以下のコードで行います。

今回は押した時のイベントだけ扱います。


広告
BTOパソコン・パソコン関連商品がお買い得!パソコン工房のセール

コードを書く

まずは、コードの流れです。

  1. 画像取り込み
  2. イベント関数の設定
  3. 機能実装
  4. 複数回使うコードの整理


画像の取り込みから表示まで

まずは、pydicom、numpy、matplotlibのインポートと毎回用いているfileselectのモジュールピクセルデータを配列に取り込むクラスのコードをコピーしましょう。

そして、画像ファイルをフォルダで一括選択しそのパスをfilenamesの変数の取り込み、クラスに渡してピクセルデータを配列に取り込みます。その後、matplotlibで画像表示領域の設定、マウスホイールを使って画像を変えていくコードまで一気に設定してしまいましょう。


イベントで返される変数を調べる

それでは、キーイベントの設定をします。キーが押された時のイベントは

で呼び出し、イベント名は ’key_press_event’ でした。

押した時の動作は、関数 ’key_press’ で書いていきましょう(関数名は何でも構いません)。まずは、キーが押された時、どのように変数が返ってくるのか確認します。

いかがでしたか?F1、F2、shiftキー等押すと上記図のような変数が返ってきます。ちなみに、’super’とはwindowsマークを押した時のeventです。

返ってくる変数が分かったので、機能を実装していきたいと思います。


機能の実装

それでは、機能を実装していきます。

まず、画像を表示するコード(上記コード56行目)ですが

の部分に、画像の最小値と、最大値を指定するコードを追加します。これは、画像のWWに当たるところですので変数名を最小値をww_L、最大値をww_Hとして指定したいと思います。

それでは、キーが押された時の設定に入ります。

CT画像のWL,WWの設定は以下のようにした場合

WLWW
頭部条件3570
肺野条件-6001600
腹部条件60360
骨部条件15003000

ww_Lとww_Hの設定はそれぞれ以下のようになります。

ww_Lww_H
頭部条件70
肺野条件-1400200
腹部条件-120240
骨部条件3000

上記条件をそれぞれF1に頭部条件,F2に肺野条件,F3に腹部条件,F4に骨条件として割り当てた場合

def key_press(event)の関数は以下となります。

そして、画像表示のコード

を付け足してあげることで画像条件を変更するプログラムは完成です。

皆さん、いかがでしたか?プログラムはきちんと動きましたか?


複数回使うコードは関数化

気づかれた方もいると思いますが、条件を変更してもマウスホイールで画像を切り替えてしまうとまた、条件が元に戻ってしまうんです。

何が原因かというと、画像を表示するコードが複数ある事で設定し忘れているところがあるんです。現在作成したコードでは41行目と、58行目に画像表示設定があるわけなのですが41行目にはvminとvmaxの指定をしていないのです。

この様に、同じコードを何度も使う場合はその部分を関数化してしまうのが間違いがなく、しかも設定が楽になりますので関数化してしまいましょう。

58行目から60行目までを関数化します。

上記関数を作成し、62行目辺りに入れます。(44行目に入れても構いません)

ただ、今の状態だとvminとvmaxの変数はkey_pressの中でだけ有効なので

global化しておきましょう。def img_show()とdef key_press(event)

の下に

と記載しておきます。

そして、41~43行目、58~60行目を

img_show()

と書き換えることで完成ですが、どうせなので、初期設定も腹部条件で表示させるようにも設定しておきましょう。

sl =0の所で一緒に設定してしまいましょう

sl , ww_L , ww_H = 0 , -120 , 240

71行目のコードを

img_show()

としてあげましょう。そうすることで画像表示の設定はimg_show()の関数内の設定だけで完了します。

完成コードを以下に示します。


最後に

皆さんいかがでしたか?

今回は、ファンクションキーに画像条件のプリセット機能を付けてみましたが、その他にも、シフトキーを押しながらマウスホイールで画像拡大とか使い道はいろいろあります。

是非とも使ってみてくださいね。

お疲れ様でした。


環境

  • windows10
  • python3.6.1
  • Anaconda custom(64-bit)
  • PyCharm2020.2(Communication Edition)

広告
上新電機 パソコン買取サービス
  • このエントリーをはてなブックマークに追加