tkinterでopenCVの画像を表示

matplotlib

はじめに

こんにちは。でめきんです。

前々回、「tkinterでmatplotlibの画像を表示」という記事を書きましたが、今回は「openCVの画像を表示する」をやってみたいと思います。

openCVは画像処理や、動画を処理するライブラリーとなっていますので、tkinter上にopenCVで取り込んだ画像を表示できれば、tkinterのGUI機能であるボタン等に画像処理の機能を実装することが出来るようになります。

いわゆる、画像処理ソフト的なものを作成することが出来るかもしれません。

一見、openCVで取り込んだ画像をtkinterに表示ととらえられるかもしれませんが、実際はopenCVで取り込んだ画像をmatplotlibで表示。それをtkinter上に表示するという流れになります。

openCV自体にtkinterのGUI上に画像を表示させる機能は無いみたいです。ネット上ではopenCVで取り込んだ画像をPILLOWを用いてtkinter上に表示する記事が多いですが、我々診療放射線技師はmatplotlibを用いて表示した方が何かと便利だと思いますので今回はmatplotlibを用いた方法を紹介します。


流れ

前々回の記事での流れと同様となります。

  1. 画像をopenCVで読み込む
  2. matplotlibの表示設定を行う
  3. tkinterのcanvas設定を行う


注意点

今回注意しなければならない点が1点あります。

それは、openCVで取り込んだ画像はBlue,Green,RedのBGR順での色情報となっています。しかし、matplotlibやPILLOWではRed,Green,BlueのRGB順で色情報が入っていますので、その順番を変えてあげる必要があります。

ちなみに、入れ替えずに画像表示をすると以下の画像となります。

左画像がオリジナル。右画像がBGRでの表示

上の図を見てみると、「3」の背景色左のRGB画像では赤ですが、右のBGR画像では青に入れ替わっています。「1」と「4」の背景色も入れ替わっていますね。

それでは、どのように変更するかというと

img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)

cv2.cvtColorといったコードを用いて、BGRからRGBに変更することができます。

ちなみに、BGR2RGBの2はタイプミスではありませんのであしからず。toの意味です。ちなみにグレイスケールに変更する場合はBGR2GLAYでできます。


コード

完成コードは以下となります。

import tkinter
import cv2
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

root = tkinter.Tk()

img_bgr = cv2.imread("img.JPG")
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) # BGRからRGBに変換

fig = plt.figure()
ax =fig.add_subplot()
ax = img_rgb

plt.imshow(img_rgb)

Canvas = FigureCanvasTkAgg(fig, master=root)
Canvas.get_tk_widget().grid(row=0, column=0)
root.mainloop()


最後に

いかがでしたか?

次回は、openCVの機能をtkinterのボタンウイジェットに組み込むという事をやってみたいと思います。

お疲れ様でした。

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