Pythonによるデータ分析・機械学習ブログ

Pythonによるデータの前処理・グラフ化、機械学習、統計解析、画像処理、Webスクレイピング、自然言語処理の基礎について紹介していきます。

MENU

【第1回】Tkinterを用いたGUI作成:ウィンドウ表示、ラベル、テキストボックス、ボタン、ラジオボタン、チェックボックス、ラベルフレーム、フレームの作成

はじめに

 アプリを作成する際にグラフィカルユーザーインターフェースGUI)として、ウィンドウを表示させて、そこでボタン操作などを行って機能を活用できるようにするのが一般的です。Pythonには、GUIを作成するためのツールキットのtkinterがあります。tkinterは標準のライブラリとなっており、インストールは不要になっています。tkinterでウィンドウ表示できる項目にラベル、テキストボックス、ボタンなどがあります。

 本記事では、tkinterを用いたGUI製作として、ウィンドウ表示、ラベル、テキストボックス、ボタン、ラジオボタンチェックボックス、ラベルフレーム、フレームの作成方法を紹介します。

SAMURAI TERAKOYA

 

1. ウィンドウの表示(tkinter.Tk())

ウィンドウ作成には、tkinter.Tk()を用います。作成したウィンドウをrootとし、root.title()でウィンドウ上部のタイトルを設定し、root.geometry()でウィンドウサイズを指定します。以下のコード例を実行してみてください。

以下の画面が表示させると思います。

 

また画面を最大化して表示させたい場合にはroot.geometry()の代わりに、root.state('zoomed')を記述することで画面を最大化した状態で表示させることができます。

 

2. ラベルの表示(tkinter.Label())

ウィンドウ内に文字を描画させたい場合には、tkinter.Label()を用います。引数には、表示するウィンドウroot、ラベルの文字text、ラベルの背景bg、ラベル文字の色fg、ラベルの幅width、ラベルの表示位置anchorなどがあります。

ラベルの文字や背景の色は色名や16進数のコードを指定することで色を変更できます。ラベルの表示位置については以下の表をご覧ください。

anchor指定内容 意味 anchor指定内容 意味
tkinter.N 上方向 tknter.NE 右上方向
tknter.S 下方向 tknter.SW 左下方向
tknter.W 左方向 tknter.SE 右下方向
tknter.E 右方向 tknter.NW 左上方向
tknter.CENTER 中央    

 

具体的な例は以下に示します。

上記で表示させると以下のようになります。

 

3. テキストボックスの表示(tkinter.Entry())

文字を入力する際に使用する場合には、tkinter.Entry()を用います。tkinter.Entry()を用いてテキストボックス(入力欄)を表示する方法について説明します。

以下の例を見ながら、起動してテキストボックスに文字を入力してみてください。

表示結果は以下の様になります。

 

4. ボタンの表示(tkinter.button())

コマンドを実行する際に使用するボタンは、tkinter.button()を用います。以下の例のようにしてウィンドウを表示してみてください。ボタンに表示させる文字のフォントやサイズ、ボタンの色、ボタンの大きさ、ボタンの枠線の種類などを引数として指定できます。

上記を表示結果が以下のようになります。

 

枠線の種類はいくつか存在し、以下の様のようなものがあります。


5. ラジオボタンtkinter.Radiobutton())

ラジオボタンを使うのにはtkinter.Radiobutton()を用います。まずはラジオボタンの選択項目を確認するために、tkinter.IntVar()としてvarを用意して、初期の選択項目としてvalue=1の項目を選択します。

以下のコード例を実行すると、ラジオボタンの選択するごとに、varの値をテキストボックスに表示させています。

画面表示は以下の様になります。

 

6. チェックボックスtkinter.Checkbutton())

チェックボックスを使うのにはtkinter.Checkbutton()を用います。まずはチェックボタンの選択有無を確認するために、tkinter.BooleanVar()を用意して、初期の選択有無を指定します。

以下のコード例を実行すると、チェックボックスにチェックが入った状態で表示され、チェックが入っている場合にはテキストボックスに1が入っていない場合には0が表示されます。

画面表示は以下の様になります。

 

7. スケールバー(tkinter.Scale())

スケールバーを使うには、tkinter.Scale()を用います。まずはスケールバーを作成するためにtkinter.DoubleVar()としてvarを用意して、初期値としてvar=50を設定します。

以下のコード例を実行すると、スケールバーが表示されて初期値が50となっています。スケールバーを動かすと下部のテキストボックスの値が0~100まで変化します。

画面表示は以下の様になります。

 

8. ラベルフレーム(tkinter.LabelFrame())

ラベルフレームを使うにはtkinter.LabelFrame()を用います。以下のコード例を実施すると、ラベルフレームが表示されます。ラベルフレーム内の背景色の変更、枠線の太さの変更、枠線の種類の変更などを表示させています。

表示結果は以下の様になります。

 

9. フレーム(tkinter.Frame())

フレームを使うにはtkinter.Frame()を用います。以下のコード例を実施すると、フレームが表示されます。フレーム内の背景色の変更、枠線の太さの変更、枠線の種類の変更などを表示させています。

表示結果は以下の様になります。

 

10. スピンボックス(tkinter.Spinbox())

スピンボックスを使うにはtkinter.Spinbox()を用います。右端の▲上下のボタンを押すことでボックスに表示された数字が変化します。選択できる値の範囲は、最小値をfrom_とし、最大値をtoとして設定できます。

表示結果は以下の様になります。

<p

 

オススメ書籍

Pythonによるあたらしいデータ分析の教科書

Python3エンジニア認定データ分析試験の教科書にもなっている書籍で、データ分析に必要なPythonの基礎手法を身に付けることができます。具体的には、numpyとpandasを用いたデータの前処理、matplotlibを用いたデータのグラフ化、scikit-learnを用いた機械学習の基礎記述方法を身に付けることができます。これ一つで基礎はバッチリで、実務でも十分活用できると思います。個人的には見やすい書籍でした。

データサイエンス教本 Pythonで学ぶ統計分析・パターン認識・深層学習・信号処理・時系列データ分析

こちらの書籍は初心者から少し記述できるようになった人、かつ数学的な理論と一緒にPythonの記述方法を理解したい方にオススメです。統計分析、パターン認識、深層学習、信号処理、時系列データといった幅広く実務で使用する手法を学びたい方にもオススメです。

東京大学のデータサイエンティスト育成講座 ~Pythonで手を動かして学ぶデ―タ分析~

こちらの基礎を抑えながら実務で必要なPython記述法を学べる書籍です。基礎を一つ一つ抑えるというよりも実務で活用できるように必要な知識を身に付けられると感じました。これ一冊あれば十分かなと思いました。

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事ではtkinterを用いたGUI製作として、ウィンドウ表示、ラベル、テキストボックス、ボタン、ラジオボタンチェックボックス、ラベルフレーム、フレームの作成方法を紹介しました。tkinterを用いてUIを作成するには基本的な内容になるので、使いこなせるようになりましょう。

【第15回】OpenCVを用いた動画表示と保存

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

OpenCVには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

OpenCVは上記などの画像処理だけではなく動画の表示や保存をすることができます。動画を取得して1フレームごとに画像処理を行うこともできます。例えば1フレームごとに人物検出を行い、検出された場合にはその部分に四角形を描画して新たな動画として保存することができます。さらには監視カメラなどの動画をRTSPで取得して表示することなどもできます。

本記事ではOpenCVを用いて基本的な動画表示と保存の方法を紹介していきます。

SAMURAI TERAKOYA

 

1. 動画の表示

動画の表示は以下のコードでできます。以下の例ではcv2.VideoCapture()の引数に0を指定することで内臓カメラの動画を読み込むことができます。while文の中でカメラ画像を1フレームずつ取得してそれを表示することで、動画として表示させています。

PC内の動画を表示させたい場合には以下のように、ビデオのファイルパスをcv2.VideoCapture()の引数に指定してください。

cap = cv2.VideoCapture('sample.mp4')

RTSPでストリーミング動画を取得するには、rtspリンクをcv2.VideoCapture()の引数に指定してください。ここではRTSP Stream for Testingで公開されているRTSPリンクを例にして記載します。

cap = cv2.VideoCapture(’rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4’)

 

2. 動画の情報の取得

元の動画から動画の幅(width)、高さ(height)、フレーム速度(fps)の条件を取得できます。それぞれ以下のように取得できます。

動画情報 コード
動画の幅 cap.get(cv2.CAP_PROP_FRAME_WIDTH)
動画の高さ cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
動画のフレーム速度 cap.get(cv2.CAP_PROP_FPS)

 

それでは実際に取得してみましょう。以下の様に記載することで、動画の幅(width)、高さ(height)、フレーム速度(fps)の条件を取得できます。

 

3. 動画の保存

続いて読み込んだ動画を保存していきます。動画の保存にはcv2.VideoWriter()を以下の様に用います。

video = cv2.VideoWriter(filepath, codec, fps, (width, height))

引数は以下の様になります。。

引数 内容
filepath 出力時のファイルパス名
codec エンコード方式
fps フレーム速度
width フレーム幅
height フレーム高さ

 

それでは動画の保存コードを確認していきましょう。以下の例では元の画像のフレームサイズ、フレーム速度(fps)を保存時のフレームサイズ、フレーム速度とし、mp4の形式で動画を保存します。

 

3. 動画を読み込み後、画像処理して保存

最後に、動画に処理をして保存する例を示します。以下の例では内臓カメラの映像を読み込んで現在の時刻を描画し、画面に表示するとともにPCにビデオを保存します。

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事ではOpenCVを用いて基本的な動画表示と保存の方法を紹介しました。画面に動画を表示したり、保存したり、画像処理後に表示&保存をする例を紹介しました。カメラ画像を用いた業務を行う人は頻繁に使用する内容になりますので、ぜひ覚えましょう。

【第14回】OpenCVを用いた画像内の特徴点マッチング

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

OpenCVには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

画像処理や動画処理をしていると、複数の画像の重なりを考慮して重ね合わせたり、姿勢推定などをしたくなります。その際に活躍するのが画像内の特徴点を抽出してマッチングをする処理です。

本記事ではOpenCVを用いた画像内の特徴点マッチングの手法を紹介します。

SAMURAI TERAKOYA

 

1. 本記事で使用する画像

本記事で使用する画像は以下の図です。

 

2. 特徴点マッチング

2.1 特徴点マッチングの全体的な流れ

以下のコードではcv2.AKAZE.create()で特徴検出をしてcv2.BFMatcher()で特徴点マッチングを行い、その結果をcv2.drawMatches()を用いて描画しています。

出力結果は以下の様になります。それぞれの特徴点が対応しているのがわかると思います。

 

2.2 特徴検出

 まずは画像から特徴を検出する特徴検出器を生成します。本記事ではcv2.AKAZE_create()を用いてAKAZE特徴検出器を生成します。

 特徴検出器が生成できたら、detectAndCompute()を用いて画像から特徴点の座標情報kpと特徴量記述子descを検出します。特徴点の座標情報はいくつかデータがまとまっていますので、一つ一つ分割しています。

 

特徴点を画像に描画するには、特徴点座標kpを用います。

特徴点を描画した結果は以下の様になります。

 

2.3 マッチング

 特徴量のマッチングを行うマッチング器を生成します。本記事ではcv2.BFMatcher(cv2.NORM_HAMMING)を用いてマッチング器matcherを生成します。さらに、matcher.match()でマッチした特徴点の関係性が格納されています。

 

2.4 マッチング描画

マッチングした特徴点の描画についてはcv2.drawMatches()を用います。

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事ではOpenCVを用いた画像内の特徴点マッチングの手法を紹介しました。こちらを用いて類似性などで活用していたければ幸いです。

 

参考ページ:

1) 画像の特徴点を抽出する - Qiita

2) 【Python】OpenCVで特徴量マッチング – ORB, SIFT, FLANN

3)  OpenCV - 特徴点マッチングを行う方法について - pystyle

 

 

【第13回】OpenCVを用いた画像処理による物体の輪郭描画:サーロインの輪郭描画

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

OpenCVには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

画像内での物体の位置を把握する方法の一つに輪郭検出があります。OpenCVを用いて輪郭検出を行うには findContours() およびcv2.polylines()などが使用されます。

本記事では、OpenCVのcv2.threshold()を用いて二値化した画像からcv2.findContours() およびcv2.polylines()を用いて輪郭を描画する方法を紹介します。

SAMURAI TERAKOYA

 

1. 本記事で使用する画像

本記事で使用する画像はお肉のフリー素材サイトoniku imagesの画像から以下のサーロインの画像を使用させていただきます。



2. 物体の輪郭検出と描画

それでは、上記のサーロインの画像を用いて以下の手順で輪郭検出していきます。

  1. HSV変換して明度の濃淡画像を取得
  2. 明度の濃淡画像を二値化処理
  3. 二値化画像から輪郭の描画

2.1 HSV変換と明度の濃淡画像の取得(cv2.cvtColor(img, cv2.COLOR_BGR2HSV))

HSV色空間は、H:色相(Hue)、S:彩度(Saturation)、V:明度(Value)を指しています。明度の濃淡画像を取得するには各成分の画像に分離します。HSV色空間への変換はcv2.cvtColor(img, cv2.COLOR_BGR2HSV)を用い、各成分の分離にはcv2.split()を用います。HSV変換についてはこちらの記事をご覧ください。

HSV変換後に、明度の濃淡画像を取得するコードは以下の様になります。

出力結果は以下の様になります。明度の濃淡画像は白っぽい部分と黒っぽい部分がはっきり分離しているのがわかると思います。

HSV変換後の画像】

【色相の濃淡画像】

【彩度の濃淡画像】

【明度の濃淡画像】

 

2.2 二値化処理(cv2.threshold())

上記の明度の濃淡画像は白っぽい部分と黒っぽい部分がはっきり分離しているのがわかると思います。こちらの明度の濃淡画像を用いて二値化処理をしていきます、二値化処理には閾値処理のcv2.threshold()を用います。用いる際には以下の様になります。

img = cv2.threshold(img, num1, num2, thresholdtype)

引数は以下の様になります。

引数 内容
img グレースケールの画像
num1 画素値の閾値
num2 閾値条件を満たした際の最大値
thresholdtype 閾値処理の種類

 

閾値処理の種類は以下の様になります。ここで画像がグレースケールで、画素値が0の場合は黒色、255の場合は白色になります。

閾値処理の種類 処理内容
cv2.THRESH_BINARY 画素値が閾値(num1)以上の場合は最大値(num2)に、閾値以下の場合は0に変更
cv2.THRESH_BINARY_INV 画素値が閾値(num1)以上の場合は0に、閾値以下の場合は最大値(num2)に変更
cv2.THRESH_TRUNC 画素値が閾値(num1)以上の場合は最大値(num2)に変更し、閾値以下の場合は元の画素値のまま
cv2.THRESH_TOZERO 画素値が閾値(num1)以上の場合は元の画素値のままで、閾値以下の場合は0に変更。※ここで最大値num2は意味がありません。
cv2.THRESH_TOZERO_INV 画素値が閾値(num1)以上の場合は0に変更し、閾値以下の場合は元の画素値のまま。※ここで最大値num2は意味がありません。

 

それでは、二値化処理をしたいと思います。以下のコードでは明度の濃淡画像(img_v.jpg)を用いて、閾値150以上の画素値であれば画素値を255にし、閾値以下であれば画素値を0にする二値化処理をしています。

出力結果は以下の様になります。肉の部分だけ白色(画素値255)、それ以外の部分は黒色(画素値0)の画像が得られました。

 

2.3 輪郭に外接する長方形の描画(cv2.boundingRect()、cv2.rectangle())

 輪郭描画の前に、輪郭に外接する長方形の描画をしてみたいと思います。まずはcv2.findContours()を用いて二値化画像の白の領域を囲む輪郭を取得します。しかし、この段階では、白い部分は小さいものもいくつかあることから誤検出をしてしまいます。そこで、面積を一定数値以上のものだけにして、肉部分の輪郭情報を取得します。さらに、cv2.boundingRect()を用いることで外接矩形の座標情報を取得することができます。その外接矩形の情報をcv2.rectangle()の引数にして長方形の描画を行います。

 

 二値化画像の白の領域を囲む輪郭を取得するのに用いるcv2.findContours()の内容は以下のようになります。戻り値は検出された輪郭の座標情報contoursと輪郭の階層構造を表すhierarchyです。

contours, hierarchy = cv2.findContours(image, mode, method)

引数は以下の様になります。

引数 内容
image 二値化画像画像
mode 輪郭取得モード
method 輪郭近似法

 

輪郭取得モードと輪郭近似法についてはこちらの記事で詳しく書かれていたので、この記事を参照してください。

【OpenCV-Python】findContoursによる輪郭検出 | イメージングソリューション

 

 外接矩形を描画するのに必要な座標情報を取得するには、cv2.boundingRectを用います。

x, y, width, height = cv2.boundingRect(array) 

引数に輪郭位置情報arrayを渡し、戻り値として外接矩形の左上の位を(x, y),横と縦のサイズを(width, height)として取得できます。

 

 外接矩形を描画するには、長方形を描画するcv2.rectangle()を用います。cv2.rectangle()についてはこちらの記事をご覧ください。

 

 それでは外接矩形を描画していきたいと思います。以下が外接矩形を描画するコードになっています。

出力結果は以下の様になります。


2.4 輪郭の描画(cv2.drawContours()、cv2.polylines())

それでは本記事の目的である物体の輪郭描画を行いたいと思います。 輪郭描画にはcv2.drawContours()を用います。cv2.drawContours()は以下の様に用います。戻り値dstは輪郭が描画された画像です。

dst = cv2.rawContours(image, contours, contourIdx, color)

引数は以下の様になります。

引数 内容
image 輪郭を描画したい画像
contours 輪郭の位置情報
contourIdx 描画する輪郭を示すパラメータ。負の場合すべての輪郭を描画
color 線の色

 

それでは輪郭を描画したいと思います。まずはcv2.findContours()を用いて二値化画像の白の領域を囲む輪郭を取得します。しかし、この段階では、白い部分は小さいものもいくつかあることから誤検出をしてしまいます。そこで、面積を一定数値以上のものだけにして、肉部分の輪郭情報を取得します。そして、cv2.drawContours()を用いて輪郭を描画します。

出力結果は以下の様になります。きれいに輪郭に線を描画することができていますね。

 

上記とは別の方法で輪郭を描画することができます。それは多角形の描画手法を用いることです。多角形の描画については以下の記事をご覧ください。

chantastu.hatenablog.com

 

多角形の描画にはcv2.polylines()を用います。詳しくは上記記事をご覧ください。

それではcv2.polylines()を用いて輪郭の描画を行います。頂点の位置情報のデータ構造を変換しなければならないので、面倒ですね・・・。

出力結果は以下の様になります。

 

2.4 複数画像での動作確認

上記で示した内容を他の画像でも画像処理を行い、輪郭描画が正常に動作するか確認します。使用する画像はお肉のフリー素材サイトoniku imagesの画像から以下のサーロインの画像を使用させていただきます。

画像処理対象の画像は以下の画像です。複数のお肉の画像を結合しました。

 

それでは上記の画像に対して輪郭描画を行います。今回は肉の面積が減少したのでそれに合わせてcv2.contourArea()で用いる閾値を1000に修正しています。それ以外は上記のコードと一緒です。

出力結果は以下です。他の画像でも輪郭描画ができているのがわかりますね。右上の斜めから撮影された画像では、上面での輪郭検出になっています。影になっている部分は検出できていないですね・・・。

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

 本記事では、OpenCVのcv2.threshold()を用いて二値化した画像からcv2.findContours() およびcv2.polylines()を用いて輪郭を描画する方法を紹介しました。具体的にはcv2.cvtColor(img, cv2.COLOR_BGR2HSV)で画像をHSV変換して明度の濃淡画像を取得し、cv2.threshold()を用いて明度の濃淡画像を二値化後、v2.findContours() およびcv2.polylines()を用いて輪郭を描画しました。本記事では肉の画像でしたが、他の物体の場合には本記事の閾値などの調整や他の手法を用いて輪郭描画をすることになるかと思います。本記事の内容は一例だと思って、参考にしてください。

【第12回】OpenCVを用いた画像内への図形の描画

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

OpenCVには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

上記の機能以外にも、OpenCVを用いて画像に図形を描画することができます。物体検出をした際にその座標にバンディングボックスの四角い枠を描画するなど図形描画は頻繁に使用します。

本記事ではOpencCVを用いた画像内への図形の描画の方法を簡単に紹介します。

SAMURAI TERAKOYA

 

1. 本記事で使用する画像

本記事では以下の白色の画像を使用します。1088×720pixelの画像となっています。

 

2. 画像内への図形の描画

それでは、いくつかのオブジェクトを描画してみたいと思います。コード例は以下の様になります。

2.1 線の描画

線の描画にはcv2.line()を用います。

 

2.2 矢印の描画

矢印の描画にはcv2.arrowedLine()を用います。

 

2.3 四角形の描画

四角形の描画にはcv2.rectangle()を用います。

 

2.4 円形の描画

円形の描画にはcv2.circle()を用います。

 

2.5 楕円の描画

楕円の描画にはcv2.ellipse()を用います。

 

2.6 多角形の描画

多角形の描画には、cv2.fillPoly()やcv2.fillConvexPoly()を用います。

 

2.7 文字の描画

文字の描画にはcv2.putText()を用います。

 

3. すべての図形の描画

上記のすべてのオブジェクトを描画した結果は以下の様になります。

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事ではOpencCVを用いた画像内への図形の描画の方法を簡単に紹介しました。物体認識、物体検出などで図形を描画したり、マスク画像を生成したりするのに使用する機能なので、ぜひ覚えて使いこなせるようにしましょう。

【第11回】OpenCVを用いたテンプレートマッチング

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

OpenCVには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

テンプレートマッチングとは、画像中からテンプレートと類似した部分を探し出す画像処理のことです。テンプレートマッチングはOpenCV用いて簡単に実施できます。

本記事では、OpenCVを用いたテンプレートマッチングの方法を紹介します。

SAMURAI TERAKOYA

 

1. 本記事で使用する画像

本記事では、以下の麺屋こころの全部のせ台湾まぜそばの画像を用います。

そしてテンプレート画像は以下の卵の黄身部分とします。

 

2. テンプレートマッチング

テンプレートマッチングとは、画像中からテンプレートと類似した部分を探し出す画像処理のことです。

テンプレート画像を用意して、テンプレート画像のサイズで対象画像内で合わせながら、類似度が高い部分を抽出していきます。以下のようにテンプレート画像を左上から右下に動かしていき、類似度を算出します。

類似度を算出すると以下のように各マスに信頼度が格納されたデータを取得することができます。こちらは拡大した図になっていて上記の画像であればもっとマス目があります。下図では類似度1の箇所が最も類似度が高い箇所となります。

そして、上記のように類似度を算出して、類似度が高い部分を抽出していきます。本記事では抽出ではなく、類似度が最も高い部分を赤い枠で囲いたいと思います。最終的には以下のような画像を取得することを目指します。

 

3. OpenCVを用いたテンプレートマッチング

 OpenCVを用いてテンプレートマッチングを実施するには、cv2.matchTemplate()を用います。cv2.matchTemplate()は以下の様に用います。

result = matchTemplate(image, templ, method)

引数は以下の表の内容になります。

引数 内容
img 対象画像
templ テンプレート画像
method 類似度の計算方法
・cv2.TM_SQDIFF:二乗差
・cv2.TM_SQDIFF_NORMED:正規化二乗差
・cv2.TM_CCORR:相互相関
・cv2.TM_CCORR_NORMED:正規化相互相関
・cv2.TM_CCOEFF:相関係数
・cv2.TM_CCOEFF_NORMED:正規化相関係数

類似度の種類は複数ありますが、基本的にはcv2.TM_CCOEFF_NORMEDを用れば問題ないと思います。cv2.TM_CCOEFF_NORMEDでうまくいかないケースでは他の方法も試してみてください。

こちらの返り値のresultは行列情報で、各マスでの類似度が格納されています。

 

類似度の行列情報から条件を満たす要素のインデックス(位置)を取得するにはnp.where()を用います。例えばresultという0~1の値が格納された行列があり、その格納された値が0.9以上の要素のインデックス(位置)を取得しています。以下の場合、[縦方向位置, 横方向位置]=[237, 441], [237, 442]・・・の組み合わせの座標情報となります。

なお、ここで得られる要素のインデックスは画像の左上を原点としたインデックス(位置)となっています。例えば今回の画像をグラフ化すると下図のようになり、左上が原点になっているのがわかると思います。

 

類似度が高い箇所に赤枠を描画するにはcv2.rectangle()を用います。四角形を描画するcv2.rectangle()は以下の様に用います。

cv2.rectangle(img, pt1, pt2, color, thickness=***)

引数は以下の様になります。

引数 内容
img 対象の画像
pt1 四角形の左上の座標(タプル型)
pt2 四角形の右下の座標(タプル型)
color 線の色、(青, 緑, 赤)の順で記載
thickness 線の太さ

 

それではテンプレートマッチングを行い、類似度が高いhttps://blog.hatena.ne.jp/chantastu/chantastu.hatenablog.com/edit?utm_source=admin-sidebar&utm_medium=referral&utm_campaign=new_entry#source箇所を赤枠で囲いたいと思います。以下の例では、cv2.TM_CCOEFF_NORMED:正規化相関係数を用いてテンプレートマッチングを行い、類似度を算出しています。さらに類似度の閾値thresholdを設け、類似度が0.95以上の座標情報を取得するようにしています。取得した座標はマッチした箇所の左上の座標になるため、四角形の描画の際の右下の座標を求めるのに、左上の座標(x, y)にテンプレート画像のサイズ(w, h)を足しています。

出力結果は以下の様になります。卵の黄身部分が赤枠で囲われていますね。

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事では、OpenCVを用いたテンプレートマッチングの方法を紹介しました。こちらの技術を用いることで、人物検出や外観検査や類似度検査などに応用することができます。

【第10回】OpenCVを用いた画像内のダメージ補修

はじめに

OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリで、画像処理・画像解析および機械学習等の機能を持つC/C++JavaPythonMATLAB用ライブラリとなっています。

OpenCVには以下のような機能があります。

  • グレースケール化
  • 2値化
  • 輪郭の検出
  • 顔検出
  • ノイズ除去
  • テンプレートマッチング

画像処理をしていると画像内にダメージが入るケースがあり、それを補修したくなりますよね。そんな時はOpenCVを用いてダメージ補修を実施してみましょう。

本記事ではOpenCVを用いた画像内のダメージ補修の方法を簡単に紹介します。

SAMURAI TERAKOYA

 

1. 本記事で使用する画像

本記事では画像処理という単語に対してよく使用される関連後のワードクラウドの図を使用します。それにペイントで白い線のダメージを加えたものです。

 

2. ダメージ補修

基本的な処理はこちらのオブジェクト除去と同じとなっています。

chantastu.hatenablog.com

 

一般的には、除去部分を記したマスク画像を用意して、cv2.inpaint()を用いてダメージ補修をします。

まずはダメージ部分を記したマスク画像を用意します。今回はcv2.threshold()で二値化して自動でマスク画像を生成しました。除去したい箇所を白くし、そのまま残したい部分は黒くします。

マスク画像を用意する内容は以下です。

今回用意したマスク画像は以下です。

 

それでは、cv2.inpaint()を用いてダメージ補修を行いたいと思います。

img = cv2. npaint(src, inpaintMask, inpaintRadius, flags)

引数は以下の表の内容です。

引数 内容
src オブジェクトを除去したい画像データ
inpaintMask 修復用マスク画像
inpaintRadius 近傍円形領域の半径(周辺のピクセルをいくつ利用するか)
flags INPAINT_TELEA(Alexandru Telea法)
INPAINT_NS(Navier Stokes法)

 

それではダメージ補修をしていきましょう。

出力結果は以下の様になります。きれいに白い線がなくなっていますが、微妙に文字が崩れている箇所があるのがわかると思います。こちらはマスク画像の生成で閾値を調整すること、ダメージ補修のcv2.inpaint()の変数を調整することで改善が見込めます。

 

オススメ書籍

Pythonで始めるOpenCV4プログラミング

実践OpenCV4 for Python 画像映像情報処理と機械学習

 

スキル修得&転職

 近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。

以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

 

おわりに

本記事ではOpenCVを用いた画像内のダメージ補修の方法を簡単に紹介しました。本記事では文字の書かれたワードクラウドの画像からマスク画像をcv2.threshold()を用いて二値化して生成し、cv2.inpaint()を用いて白い線を除去しました。画像内の不要なものが写り込み、それを除去したいケースが多いかと思いますので、こちらの手法を活用していきましょう。マスク画像の自動生成もOpenCVで行えると、かなり簡単にオブジェクト除去ができますので、そちらも一緒に考えると良いかと思います。