Python

画像処理をマスターしよう!PythonでOpenCVを使う方法を紹介!

OpenCVを使用して画像処理を行いたいと考えている人もいるでしょう。しかし、Pythonを勉強し始めたばかりでOpenCVの使い方やインストール方法が分からないという方もいるはずです。

そこで今回はOpenCVの基礎知識やインストール方法から具体的な画像処理方法まで詳しく説明します。

OpenCVについて

「OpenCV」とは、Open Souece Computer Vision Libraryの略で、画像や動画を処理するための機能がまとめて実装されているオープンソースのライブラリです。

元々はC/C++で動作するライブラリでしたがPythonでも使用できるようになっています。

PythonでOpenCVを使用するメリットとしては、

  • コードが短くて読みやすい
  • コードの可読性が良く本格的な画像処理が可能
  • 周辺ライブラリパッケージが充実しており、scipyやnumpyなど他のライブラリと組み合わせやすい
  • エラーの原因を特定しやすい

といったことが挙げられます。

OpenCVのインストール方法

PythonでOpenCVを利用するためには「OpenCV-Pythonライブラリ」をインストールする必要があります。OSによってインストール方法が違うため、ここでは「Windows」「MacOS」「Linux」の3つのOSでインストールする方法を紹介します。

Windows

Windowsの場合、最も簡単な「pip」でセットアップすることができます。「コマンドプロンプト」または「PowerShell」でpipコマンドが使用できる状態で次のコマンドを実行します。

1. pip install opencv – python

実行後、万が一エラーが発生した場合は次のコマンドを入力してpipをアップデートしてから再度インストールを試してみましょう。

1. pip install –upgrade pip

Mac

Macの場合は、「homebrew」を使用して簡単にインストールすることができますよ。事前にhomebrewをインストールする必要があるので済ませておきましょう。

まずは次のコマンドを入力しましょう。

1. brew install python3   # Pythonの最新版をインストール
2. pip3 install numpy   # numpyをインストール
3. brew tap homebrew / science   # スクリプトをインストール

すべてのコマンドの入力が完了したら次のコマンドを実行して、OpenCVをインストールしましょう。

1. brew install opencv3 –with-python3 –without-python

Linux

LinuxはOSによってインストール方法が違います。ここでは代表として「Raspberry PI」でインストールする方法を紹介していきます。

まずは、OpenCVをインストールするための依存パッケージをインストールしましょう。

1. sudo apt – get install cmake git libdtk 2.0 – dev pkg – config libavformat – dev libswscale – dev python – dev python – numpy libtbb2 libtbb – dev libjpeg – dev libpng – dev libtiff – dev libjasper – dev libdc1394 -22 – dev

次に、pipでOpenCVをインストールし、OpenCVを動かすために必要なプログラムもインストールしましょう。

1. sudo pip3 install opencv – python
2. sudo pip3 install opencv – contrib – python
3.
4. # 動かすためのプログラム
5. sudo apt install libhdf5 – 103 libqtgui4 libatlas3 – base libjasper1 libqt4 – test

インストールできているかチェック

正しくOpenCVがインストールされているかをチェックするには、コマンドラインからPythonの対話型実行環境を実行してOpenCVのライブラリcv2が利用できるかをチェックするのが簡単です。

対話型実行環境が起動されると「>>>」とプロンプトが表示されるので次のコマンドを入力しましょう。

1. import cv2

エラーが出力されなければインストールできていますよ。インストールできていなければ「ImportError : No module named ‘cv2’」などのエラーが表示されます。

OpenCVの機能

OpenCVには

  • 画像の読み込み・表示
  • 画像の作成・保存
  • 画像のトリミング・リサイズ・重ね合わせ
  • 画像の回転・上下反転・左右反転
  • グレースケール変換・色チャンネル分析・減色処理
  • モザイク処理・マスク処理・2枚の画像を合成
  • 図形の描画・文字の描画
  • ノイズ除去・平滑化・ぼかしフィルタ・メディアンフィルタ・ガウシアンフィルタ
  • 物体検出
  • テンプレートマッチング

といったさまざまな機能が備わっています。

今回は「画像の読み込み・表示」「顔の検出」「円の検出」について説明していきます。

画像の読み込み・表示・保存

画像を読み込むには「cv2 . imread( )」を使用します。画像が作業ディレクトリの中に保存されている場合は「ファイル名」のみを指定します。作業ディレクトリ以外のところに保存されている場合には、絶対パスや相対パスで指定しなければなりません。

第2引数は画像の読み込み方法を指定するためのフラグで次のような意味があります。

  • cv2 . IMREAD_COLOR…カラー画像として読み込み、画像の透明度は無視される
  • cv2 . IMREAD_GRAYSCALE…グレースケール画像として読み込む
  • cv2 . IMREAD_UNCHANGED…アルファチャンネルも含めた画像として読み込む

これらのフラグを使用する代わりに、上から1、0、-1の整数値を与えて指定することもできますよ。

実際にコードを使用して説明します。

1. import cv2
2.
3. # 画像の読み込み
4. img = cv2 . imread ( ‘ファイル名 . jpg’ , 1 )

画像ファイルのパスが間違っていても、エラーにはなりません。しかし、「print(img)」を実行すると「None」と表示されることになります。

上記のコードを実行しても、まだ読み込みが完了しただけなので、何も起こりません。
画像をウインドウ上に表示するためには「cv2 . imshow( )」を使用します。ウインドウのサイズは自動的に画像サイズに合わせられますよ。

1. cv2 . imshow ( ‘ウィンドウ名’ , img )
2. cv2 . waitKey ( 1 )
3. cv2 . destroyAllwindows( )

第1引数は文字列型で指定するウインドウ名で、第2引数は表示したい画像です。必要に応じて複数個のウインドウを表示することが可能ですが、各ウインドウには異なる名前を付ける必要があります。

なお、「cv2 . waitKey( )」はキーボード入力を処理する関数で、「cv2 . destroyAllWindows( )」は現在までに作成されたすべてのウインドウを閉じる関数ですよ。

ここまででは画像は保存できておらず、ただ表示させただけです。
画像を保存するには「cv2 . imwrite( )」を使用します。

1. # 第1引数は画像のファイル名、第2引数は保存したい画像
2. cv2 . imwrite ( ‘ファイル名’ , img )

画像のトリミング・リサイズ

画像のトリミング方法は次のようになっています。

1.  %matplotlib inline
2.  import cv2
3.  import matplotlib . pyplot as plt
4.
5.  img = cv2 . imread ( ‘ファイル名 . jpg’ )
6.  # 高さ
7.  height = img . shape [ 0 ]
8.  # 幅
9.  width = img . shape [ 1 ]
10. # 高さ・幅を150pixelずつ取り除く
11. trim _ img = img [ 150 : height , 150 : width ]
12. # matplotlibで表示する場合はRGBからBGRに変換
13. trim _ img = cv2 . cvtColor ( trim _ img , cv2 . COLOR _ RGB2BGR )
14. plt . imshow ( trim _ img )

また、画像のサイズ変更を行うには「cv2 . resize( )」を使用します。

1. import cv2
2. import numpy as np
3.
4. img = cv2 . imread ( ‘ファイル名 . jpg’ )
5.
6. res = cv2 . resize ( img , None , fx=2 , fy=2 , interpolation = cv2 . INTER _ CUBIC )
7.
8. height , width = img . shape [ : 2 ]
9. res = cv2 . resize ( img , ( 2*width , 2*height ) , interpolation = cv2 . INTER _ CUBIC )

補間方法は次の通りです。

  • cv2 . INTER _ AREA…縮小
  • cv2 . INTER _ CUBIC…拡大
  • cv2 . INTER _ LINEAR…拡大

顔を検出

顔の検出には「cv2 . CascadeClassifier( )」を使用します。OpenCVでは、あらかじめ事前に学習を済ませたいくつかの学習機を提供しているため顔・目・笑顔などの検出を行うことができます。

それでは実際にコードを用いて顔・目の検出を行ってみましょう。
まず、XMLファイルから識別機を読み込んで、入力画像をグレースケールモードで読み込んでみましょう。

1. import numpy as np
2. import cv2
3. # Haar – like特微分類器の読み込み
4. face _ cascade = cv2 . CascadeClassifier ( ‘XMLファイル名’ )
5. eye _ cascade = cv2 . CascadeClassifier ( ‘XMLファイル名’ )
6. # イメージファイルの読み込み
7. img = cv2 . imread ( ‘画像ファイル’ )
8. # グレースケール変換
9. gray = cv2 . cvtColor ( img , cv2 . COLOR _ BGR2GRAY )

次に入力画像に対して顔の検出を行いましょう。

1.  faces = face _ cascade . detectMultiScale (gray , 1 . 3 , 5 )
2.  for ( x , y , w , h ) in faces :
3.   img = cv2 . rectangle ( img , ( x , y ) , ( x + w , y + h ) , ( 255 , 0 , 0 ) , 2 )   # 検知した顔を囲む
4.   roi _ gray = gray [ y : y + h , x : x + w ]   # 顔画像/グレースケール
5.   roi _ color = img [ y : y + h , x : x + w ]   # 顔画像/カラースケール
6.   eyes = eye _ cascade . detectMultiScale ( roi _ gray )   # 顔の中から目を検知
7.   for ( ex , ey , ew , eh ) in eyes :
8.    cv2 . rectangle (roi _ color , ( ex , ey ) , ( ex + ew , ey + eh ) , ( 0 , 255 , 0 ) , 2 )   # 検知した目を囲む
9.  # 画像を表示
10. cv2 . imshow ( ‘img’ , img )
11. # キーを押したら終了
12. cv2 . waitKey ( 0 )
13. cv2 . destroyAllWindows ( ) 

このように検出された顔の位置が「Rect( x , y , w , h )」として出力されますよ。

まれに目ではない部分が検出されることがありますので注意してくださいね。

円の検出

円の検出には「cv2 . HoughCircles( )」を使用します。

1.  import cv2
2.  import numpy as np
3.
4.  img = cv2 . imread ( ‘画像ファイル名’ , 0 )
5.  img = cv2 . medianBlur ( img , 5 )
6.  cimg = cv2 . cvtColor ( img , cv2 . COLOR _ GRAY2BGR )
7.
8.  circles = cv2 . HoughCircles ( img , cv2 . HOUGH _ GRADIENT , 1 , 20 ,
9.   param1 = 500 , param2 = 30 , minRadius = 0 , maxRadius = 0 )
10.
11. circles = np . uint16 ( np . around ( circles ) )
12. for i in circles [ 0 , : ] :
13.  # draw the outer circle
14.  cv2 . circle ( cimg , ( i [ 0 ] , i [ 1 ] ) , i [ 2 ] , ( 0 , 255 , 0 ) , 2 )
15.  # draw the center of the circle
16.  cv2 . circle ( cimg , ( i [ 0 ] , i [ 1 ] ) , 2 , ( 0 , 0 , 255 ) , 3 )
17.
18. cv2 . imshow ( ‘detected circles’ , img _ org )
19. cv2 . waitKey ( 1 )
20. cv2 . destroyAllWindows ( )

cv2 . HoughCircles( )で指定している引数「param1」の値を小さくすると、より多くの円が検出されるようになりますよ。

輪郭の検出

輪郭の検出には「cv2 . findContours( )」を使用します。第1引数は入力画像、第2引数はcontour retrieval mode、第3引数は輪郭検出方法を指定しますよ。

画像をグレースケールに変更した後、各点がある程度明るい箇所を輪郭として検出してみましょう。

1.  import numpy as np
2.  import cv2
3.
4.  im = cv2 . imread ( ‘ファイル名 . jpg’ )
5.  imgray = cv2 . cvtColor ( im , cv2 . COLOR _ BGR2GRAY )
6.  ret , thresh = cv2 . threshold ( imgray , 107 , 255 , 0 )
7.  img , contours , hierarchy = cv2 . findContours ( thresh , cv2 . RETR _ EXTERNAL , cv2 . CHAIN _ APPROX _ SIMPLE )
8.
9.  img = cv2 . drawContours ( im , contours , -1 , ( 0 , 0 , 255 ) , 3 )   # 全輪郭を描画
10.
11. cv2 . imshow ( ‘im’ , im )
12. cv2 . waitkey ( 0 )
13. cv2 . destroyAllWindows ( )

このコードを実行すると、cv2 . findContours( )で輪郭を検出して、cv2 . drawContours( )で輪郭として検出された部分を赤い線で描きます。

「cv2 . CHAIN _ APPROX _ SIMPLE」を指定すると輪郭を圧縮して冗長な点の情報を取り除き、メモリの使用を抑えることが可能です。

6行目で指定している「107」の部分を調整すると、検出される輪郭の形状が変更されます。

また、9行目で指定しているcv2.drawContours()の第3引数を「3」にすると、画像の中にある1つの輪郭を描画できますよ。

Canny法によるエッジの検出

Canny法でエッジを検出するには「cv2 . Canny( )」を使用します。

1.  import cv2
2.  import numpy as np
3.
4.  img = cv2 . imread( ‘ファイル名 . jpg’ , 0 )
5.
6.  edges = cv2 . Canny ( img , 100 , 200 )   # エッジ抽出
7.
8.  cv2 . imshow ( ‘edges’ , edges )   # 結果表示
9.  cv2 . waitKey ( 0 )
10. cv2 . destroyAllWindows ( )

画像のヒストグラムを求める

画像のヒストグラムを求めるには「cv . calcHist( )」を使用します。画像のヒストグラムでは横軸に明るさの階調・縦軸にピクセル数をR・G・Bのチャンネルごとに表示します。

ヒストグラムはopencv-pythonだけで求めることができますが、可視化するのが大変なため、ここでは「matplotlib」を使用します。

Anaconda環境のターミナルを起動して次のコマンドを入力します。

1. # matplotlibのインストール
2. pip install matplotlib

matplotlibをインストールした後に以下のコードを実行しましょう。

1.  import cv2
2.  import numpy as np
3.  from matplotlib import pyplot as plt
4.
5.  img = cv2 . imread ( ‘ファイル名 . jpg ‘)   # 入力画像を読み込む
6.  color = ( ‘b’ , ‘g’ , ‘r’ )
7.  for i , col in enumerate ( color ) :
8.   histr = cv2 . calcHist ( [ img ] , [ i ] , None , [ 256 ] , [ 0 , 256 ] )   # ヒストグラムの算出
9.   plt . plot ( histr , color = col )   # ヒストグラムの表示
10.  plt . xlim ( [ 0 , 256 ] )
11. plt . show ( )

まとめ

今回OpenCVについて説明してきましたがいかがでしたでしょうか。

今回説明した要点をまとめると以下のようになります。

  • OpenCVとは画像・動画を処理するためのオープンソースのライブラリ
  • 画像の読み込みにはcv2 . imread( )を使用
  • 画像の表示にはcv2 . imshow( )
  • 画像の保存にはcv2 . imwrite( )を使用
  • 顔の検出にはcv2 . CascadeClassifier( )を使用
  • 円の検出にはcv2 . HoughCircles( )を使用
  • 輪郭の検出にはcv2 . findContours( )を使用
  • Canny法でエッジを検出するにはcv2 . Canny( )を使用
  • 画像のヒストグラムを求めるにはcv . calcHist( )を使用

しっかり押さえておきましょう。

プログラミングの家庭教師『Tech Teacher』


引用元:Tech Teacher

「スクールに通い続ける自信がない…」
「時間がなくてスクールに通えない…」

そんな方にはプログラミングの家庭教師『Tech Teacher』がおすすめです。
Tech Teacherはマンツーマン指導なので、生徒様一人ひとりに最適な指導を行うことができます。また、オンライン指導も可能なので、全国どこにいても家庭教師の授業を受けることができます。

Tech Teacherの3つの特徴


生徒様に最適化されたマンツーマン指導
完全マンツーマンの指導なので、生徒様の目的・学習状況・ご要望に合わせて、最適な指導をご提供いたします。

指導力・人柄・相性の優れた教師のご紹介
Tech Teacherには採用率20%の選考を突破した、指導力の高い教師が在籍しています。また、選考では指導力だけではなく人柄も重視しております。

1,000人の教師が在籍!幅広い指導に対応可能
業界トップレベルの1,000人の教師が在籍しています。そのため、幅広い言語・ツール・目的に対応することができます。

家庭教師ならではの5つの魅力


オーダーメイドのカリキュラム
生徒様一人ひとりに習熟度・目的・期間に応じて最適なカリキュラムを提供いたします。

きめ細やかなフォローが可能
生徒様からのご要望にきめ細やかに対応し、学習計画や勉強法などの指導もできるので、普段の勉強も捗ります。

習い事・学業・お仕事との両立が簡単
教室に通う必要がないので親御様の送迎も不要です。授業時間・頻度を生徒様のご都合に合わせて自由に調節することができます。

自分のペースで進められる
生徒様の理解度や意欲に応じて授業のスピードを調節できます。不明点や疑問点は都度立ち止まって解消できるので、着実に理解して進むことができます。

すぐ質問できるから挫折しない
先生を独り占めできるので、周りの目を気にすることなく分からないところをいつでも質問できます。

Tech Teacherへのお問い合わせ

無料体験授業・資料請求のお問い合わせはこちらから

質問のみのお問い合わせも受け付けております。