画像・音声処理

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

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

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


本ブログを運営しているTech Teacherは、業界初のプログラミング家庭教師サービスを提供しています。

その特徴は完全マンツーマン・フルオーダーメイド指導・30分ごとの利用が可能であるところです。

完全マンツーマン

一般的なプログラミングスクールの録画講義や対面講義では内容をうまく理解できないまま先に内容が進んでしまうことがあります。Tech Teacherのマンツーマン指導なら理解できない箇所は何度も分かるまで説明を受けることができます。

フルオーダーメイド指導

Tech Teacherではあらかじめ決められたカリキュラムはありません。そのためご自身の学習状況や学びたいことに合わせた指導が可能です。

一括支払いなし

一般的なプログラミングスクールの料金体制はカリキュラムに対して一括払いですが、Tech Teacherでは利用した分だけの支払いとなります。そのため、大きな費用負担がなく気軽に始めることができます。

データサイエンスをマンツーマン指導で学べるプログラミング家庭教師について詳しく知りたい方ほこちら

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 ( )

「Tech Teacherで!~家庭教師ならではの3つの魅力~」

本Blogを運営するプログラミング家庭教師Tech Teacherは以下のような疑問をすべて解決できるサービスです。

・データサイエンスをもっと学びたいが、値段が高いスクールに通うのは気が引ける

・目的別に短時間の利用ができるサービスがあったらいいな

比較対象 Tech Teacher プログラミングスクールA社
受講形態
生徒1人に教師1人
(対面またはオンライン)

生徒3~5人に教師1人
(少人数個別指導)
担当教師
自分で選んだ担任教師
×
講座で決められた教師
カリキュラム
生徒様に最適化された
オーダーメイド指導

全員同じ教材・カリキュラム
仕事・学業との両立
可能
×
不可能
メンター制度
担任教師が一貫して
質問・学習状況を管理

質問対応・学習管理の担当が異なる
料金
授業時間分だけ
(3,960円 / 30分~)
×
一括払い
(528,000円 / 3ヶ月)
初期費用
入会金
(22,000円)
×
料金一括払い
(528,000円)
シミュレーション
(3ヶ月90分の指導を週1で行う)

(164,500円)
×
(528,000円)

以下、Tech Teacherの3つの魅力を紹介します。

データサイエンスをマンツーマン指導で学べるプログラミング家庭教師について詳しく知りたい方ほこちら

1.効率的な学習スタイル

一人のためだけの指導~1対1の完全個別指導~

一般的なプログラミングスクールでは大人数の対面講義や、録画講義の視聴またはオンラインでの受講がメインです。そうなると学習しながら生じた疑問をすぐに聞くことができずに、先に進んでしまい内容をうまく理解できなかったり、作業がうまく進まなかったりします。

家庭教師であれば、マンツーマンのため自分の課題にだけ焦点を当てて指導を受けられるので、1回の授業を濃い時間にすることができます。

無駄のない学習~フルオーダーメイド~

Tech Teacherは一般的なプログラミングスクールと異なり、あらかじめ決められたコースやカリキュラム設定がありません。

一般的なプログラミングスクールのカリキュラムでは、自分が本当に学習したいことを学ぶのにいくつか他の講義を受けなければなりません

Tech Teacherでは生徒様の現状の習熟度・目的・期間に応じてお悩みにダイレクトに刺さる授業を展開し、最短で目標となるゴールを目指せます。

2.自分のペースに合わせて学習できる

必要な分だけ~従量課金モデル~

Tech Teacherでは、他にはない「短時間(30分ごと)」の利用が可能です!勉強していてちょっとわからないところ、プログラミング学習のモチベーション維持など様々な疑問や悩みを解決することができます。

授業を受けた分だけ後払いする料金体系(3,960円〜 / 30分)のため、必要な期間に必要な分だけ受講できます。

好きな時間で~相性のいい教師の紹介~

Tech Teacherではあらゆるニーズに対応できる教師陣がいるため、生徒様の希望条件に最適な教師を紹介します。

Tech Teacherを受講している方のほとんどが仕事をしている社会人の方です。TechTeacherの家庭教師なら受講日時や回数を、生徒様のご都合に合わせて柔軟に調整することができ、スキルだけでなく都合の良い時間で指導できる教師を選べます。

3.確実に身につく

挫折しない~担任教師の継続指導~

オンライン・オンデマンドの講義の視聴形態だと、学習に対するモチベーションの維持が課題となり、当初の予定よりも受講期間が伸びたり、挫折したりする恐れがあります。

Tech Teacherでは、担任教師が生徒と二人三脚で学習をするため、学習が大変なときも寄り添ったサポートを受けられます。

具体的には学習計画の管理や受講目的を明確にした上で中間目標を設定し、それに向けた学習の指導をすることでモチベーションの維持を図ります。

いつでも質問できる~チャットサポート(オプション)~

担当教師は授業の時間以外に、チャットサービスを利用して、自分で学習しているときに生じた疑問をすぐに質問して解決することができます。

データサイエンスをマンツーマン指導で学べるプログラミング家庭教師について詳しく知りたい方ほこちら

Tech Teacherへのお問い合わせ



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

まとめ

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

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

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

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

Pythonでの動画処理に関心のある方にはこちらの記事もおすすめです。

Pythonで動画処理を行うには?ライブラリの使い方を解説!Pythonで動画処理に挑戦したいが、手を出せずにいる方はいますか。本記事ではPythonでの動画処理方法について解説していきます。動画処理を学ぼうと思っている方はぜひお読みください。...

また、機械学習に関心のある方にはこちらの記事がおすすめです。

機械学習スキルを上達させるには?Kaggleを使うのがおすすめの理由機械学習の勉強をしたいが上達方法が分からない、という方は多いかと思います。 プログラミングの文法やアルゴリズムの勉強方法は分かるけれど...