Pythonで画像処理をしたい!と思ったときに、真っ先に見つかるのがOpenCVというライブラリでしょう。
このOpenCV(Pythonで使う場合はopencv-python)はとても有名なのですが、どういうわけかちょっとハードルが高い気がしていませんか?
- インストール方法がいろいろあって迷う
- opencv-pythonチュートリアルのコードを試しても、なぜかうまくいかない
そこで、この記事では、よく紹介されているインストール方法3つを紹介した上で、オススメのインストール方法を1つに絞りました。
また、キチンと動作するコードも、パラメーターを変更するコツとあわせて書きました。opencv-pythonを使い始める第一歩として、ちょうど良い記事になっていますので、記事を読みながら手を動かしてみてくださいね!
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
OpenCVとは
OpenCV(Open Source Computer Vision Library)は、コンピューターで画像や動画を処理するための機能がまとめて実装されている、オープンソースのライブラリです。
機能が豊富すぎてこの記事では紹介しきれません。
「OpenCV-Python Tutorials」というサイトで、様々な機能が紹介されていますので、ぜひ確認してみてください。
なお、OpenCVはPythonに限らず、C++用のインターフェースやJava用のインターフェースが用意されており、これらの言語からも同じ機能を利用できます。
この記事では、Pythonから利用するopencv-pythonだけを紹介します。
opencv-pythonをインストールしよう
PythonからOpenCVを利用するには、opencv-pythonライブラリをインストールします。OpenCVは、いくつかの方法でインストールできますが、初めに紹介している「pip install opencv-pythonでインストールする」が最も簡単でオススメです。
私は、Anacondaで「opencv」という名前のAnaconda環境(Python 3.6)を作成して、そこにopencv-pythonをインストールしました。
Anacondaのインストールについては、以下の記事で説明していますので、ぜひご覧ください。
pip install opencv-pythonでインストールする
繰り返しになりますが、私が最もオススメするインストール方法です。この記事でも、この方法でインストールしたopencv-pythonとnumpyを利用しています。
(1)Anaconda環境(opencv)のターミナルを起動し、以下のコマンドを入力します。
pip install opencv-python
このコマンドを使うと、opencv-pythonだけでなく、numpyもインストールされます。
pip install opencv_python‑X.X.X‑cpXX‑cpXXm‑win_amd64.whlでインストールする
上の方法が気に入らない場合は、以下のようにwhlファイルをダウンロードして、インストールする方法もあります。
(1)https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencvにアクセスし、whlファイルをダウンロードします。
私の環境では「opencv_python‑3.4.1‑cp36‑cp36m‑win_amd64.whl」をダウンロードすることになりますが、お使いの環境に合わせてファイルを選択してください。
(2)ダウンロードできたら、Anaconda環境(opencv)のターミナルを起動し、以下のコマンドを入力します。
pip install opencv_python‑3.4.1‑cp36‑cp36m‑win_amd64.whl
(3)同様に、以下のコマンドを入力して、numpyをインストールします。
pip install numpy
これで、opencv-pythonが使えるようになります。
OpenCVの公式サイトからダウンロードしたファイルを利用する
上記の2つの方法以外に、OpenCVの公式サイトから、opencv-3.4.1-vc14_vc15.exeをダウンロードしてインストールする方法もあります。
これが最も信頼できると考え、真っ先に挑戦したのですが、残念ながらPython 2.7専用で、Python 3.6では動作しませんでした。
代表的な機能を確認しよう
opencv-python(OpenCV)の代表的な機能を紹介しておきましょう。
コードも用意しましたので、お手持ちの画像でいろいろ試して見てくださいね!
顔検出を試してみよう
顔検出は、cv2.CascadeClassifier()を使います。
OpenCV-Pythonチュートリアルでは、以下のページで取り上げられています。
なお、CascadeClassifier()で指定しているxmlが保存されているフォルダ「C:UsersXXXXXXXXAnaconda3envsOpenCVLibsite-packagescv2data」は、Anaconda環境(opencv)内のフォルダで、opencv-pythonをインストールすると作成されます。
import numpy as np import cv2 face_cascade = cv2.CascadeClassifier('C:UsersXXXXXXXXAnaconda3envsOpenCVLibsite-packagescv2datahaarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('C:UsersXXXXXXXXAnaconda3envsOpenCVLibsite-packagescv2datahaarcascade_eye.xml') img = cv2.imread('shutterstock_1055756639.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] eyes = eye_cascade.detectMultiScale(roi_gray) for (ex,ey,ew,eh) in eyes: cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) cv2.imshow('img',img) cv2.waitKey(0) cv2.destroyAllWindows()
元画像:
検出結果:
目じゃないところも検出していますが、概ねよさそうです。
輪郭を検出してみよう
輪郭検出は、cv2.findContours()を使います。
OpenCV-Pythonチュートリアルでは、以下のページで取り上げられています。
画像をグレースケールに変更し、各点の明るさがある程度の場所を輪郭として検出します。cv2.findContours()で輪郭を検出し、cv2.drawContours()で、輪郭として検出された部分に赤い線を描いています。
6行目のcv2.threshold()で指定している「88」が明るさの境界値になっていて、これを調節すると検出される輪郭の形状が変わります。
import numpy as np import cv2 im = cv2.imread('shutterstock_401797897.jpg') imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(imgray,88,255,0) img, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) img = cv2.drawContours(im, contours, -1, (0,0,255), 3) cv2.imshow('im',im) cv2.waitKey(0) cv2.destroyAllWindows()
元画像:
検出した輪郭(赤線):
Canny法でエッジを検出してみよう
Canny法でエッジを検出するには、cv2.Canny()を使います。cv2.Canny()の2つ目と3つ目の引数を調整すると、検出できる輪郭が変わります。
OpenCV-Pythonチュートリアルの以下のページをご覧いただき、Canny法のアルゴリズムを理解して調節してみてください。
import cv2 import numpy as np img = cv2.imread('py_back.jpg',0) edges = cv2.Canny(img,100,200) cv2.imshow('edges',edges) cv2.waitKey(0) cv2.destroyAllWindows()
元画像:
検出したエッジ:
画像のヒストグラムを求めよう
画像のヒストグラムを求めるには、cv2.calcHist()を使います。画像のヒストグラムでは、R(赤)、G(緑)、B(青)のチャンネルごとに、横軸が明るさの階調(0~255)を示し、縦軸がピクセル数を示しています。
ヒストグラムを求めるのはopencv-pythonだけでできるのですが、それを可視化するのは大変です。
そこで、可視化するためにmatplotlibを使います。Anaconda環境(opencv)のターミナルを起動し、以下のコマンドを入力して、matplotlibをインストールしてください。
pip install matplotlib
matplotlibをインストールすれば、以下のコードが動きます。
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('shutterstock_1055756639.jpg') color = ('b','g','r') for i,col in enumerate(color): histr = cv2.calcHist([img],[i],None,[256],[0,256]) plt.plot(histr,color = col) plt.xlim([0,256]) plt.show()
元画像:
ヒストグラム:
円を検出してみよう
円検出は、cv2.HoughCircles()を使います。cv2.HoughCircles()で指定している「param1=540」の数値を小さくすると、もっと多くの円が検出されるようになります。
OpenCV-Pythonチュートリアルでは、以下のページで取り上げられています。
import cv2 import numpy as np img_org = cv2.imread('shutterstock_1055756639.jpg') imgray = cv2.cvtColor(img_org,cv2.COLOR_BGR2GRAY) imgray = cv2.medianBlur(imgray,5) circles = cv2.HoughCircles(imgray,cv2.HOUGH_GRADIENT,1,20, param1=540,param2=30,minRadius=0,maxRadius=0) circles = np.uint16(np.around(circles)) for i in circles[0,:]: # draw the outer circle cv2.circle(img_org,(i[0],i[1]),i[2],(0,255,0),2) # draw the center of the circle cv2.circle(img_org,(i[0],i[1]),2,(0,0,255),3) cv2.imshow('detected circles',img_org) cv2.waitKey(0) cv2.destroyAllWindows()
元画像:
円の検出結果(緑色が円、赤点が中心):
このままPythonを学び続けて大丈夫?
なぜPythonを学ぶのか?
あなたがPythonを学ぶ理由は何でしょうか?
- Pythonが人気だからとりあえず学んでいる
- AIや機械学習の分野に興味があるから
Pythonは初心者向けの言語と言われています。その理由としてシンプルでわかりやすい構文や、実用的なライブラリが豊富なことが挙げられ、実際に学びやすい言語です。
しかし、もしあなたが機械学習に興味があって、とくに知識も無いまま学習を進めると、挫折する可能性が高いと言えます。
機械学習の分野はプログラミング以外にも、専門的な知識や数学の知識も必要になります。ただなんとなく学習していると早い段階でつまづきやすく、そのまま挫折してしまうなんてことも…。
そのため、挫折しないためには、
- 最適な学習環境を用意する
- 必要なライブラリ・ツールを導入する
- わからないことを質問できるメンターを見つける
などが必要になります。
効率よく学びたいなら、無料カウンセリングがおすすめ
まだまだ知りたいことがたくさんある!
もっと詳しくPythonについて知りたい!
といった悩みや願望を持っている方は、弊社「侍エンジニア」をご利用下さい。
侍エンジニアでは、
- 現役エンジニアによるマンツーマンレッスン
- キャリアアドバイザーによる転職・就職支援
- 業界屈指のフリーランス・起業サポート
を受けることができます。
業界屈指のコンサルタントから、効率的な学習方法や仕事獲得術、今後のキャリアまでさまざまな疑問を相談してみませんか?遠方の方でもオンラインで受講できます!お気軽に受講下さい。
侍エンジニア無料カウンセリングを受ける
まとめ
今回は、PythonでOpenCVを使うために、opencv-pythonをインストールしました。
また、[OpenCVの代表的な機能として、sc name=”red”]顔検出(目検出も)、輪郭検出、エッジ検出、画像のヒストグラムの表示、円検出のコードを紹介しました。
ヒストグラムの表示では、コードを短くするためにmatplotlibをインストールしましたが、これはそのままOpenCV3とmatplotlibの相性が良いことを示しています。
このような画像処理は、今後増えていく機械学習関連のプロダクトで使うことになりますので、今のうちにOpenCVによる画像処理の基本を押さえておくのはとても大事なことでしょう。
頑張りましょう!