Pythonで画像処理をするならOpenCVがオススメ!

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-python01

なお、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のインストールについては、以下の記事で説明していますので、ぜひご覧ください。

【TensorFlow/Chainer挑戦者必見】Anacondaのインストール方法
更新日:2024年4月29日

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チュートリアルでは、以下のページで取り上げられています。

引用元:OpenCV https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html

なお、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()

元画像:

shutterstock_1055756639

画像:shutter stock

検出結果:

opencv-python02

目じゃないところも検出していますが、概ねよさそうです。

輪郭を検出してみよう

輪郭検出は、cv2.findContours()を使います。

OpenCV-Pythonチュートリアルでは、以下のページで取り上げられています。

引用元:OpenCV https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_contours/py_contours_begin/py_contours_begin.html

画像をグレースケールに変更し、各点の明るさがある程度の場所を輪郭として検出します。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()

元画像:

shutterstock_401797897

引用元:shutter stock

検出した輪郭(赤線):

opencv-python03

Canny法でエッジを検出してみよう

Canny法でエッジを検出するには、cv2.Canny()を使います。cv2.Canny()の2つ目と3つ目の引数を調整すると、検出できる輪郭が変わります

OpenCV-Pythonチュートリアルの以下のページをご覧いただき、Canny法のアルゴリズムを理解して調節してみてください。

引用元:OpenCV https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_canny/py_canny.html

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

元画像:

py_back

画像:shutter stock

検出したエッジ:

opencv-python04

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

画像のヒストグラムを求めるには、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()

元画像:

shutterstock_1055756639

画像:shutter stock

ヒストグラム:

opencv-python05

円を検出してみよう

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

OpenCV-Pythonチュートリアルでは、以下のページで取り上げられています。

引用元:OpenCV https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html

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

元画像:

shutterstock_1055756639

画像:shutter stock

円の検出結果(緑色が円、赤点が中心):

opencv-python06

このままPythonを学び続けて大丈夫?

なぜPythonを学ぶのか?

あなたがPythonを学ぶ理由は何でしょうか?

  • Pythonが人気だからとりあえず学んでいる
  • AIや機械学習の分野に興味があるから

Pythonは初心者向けの言語と言われています。その理由としてシンプルでわかりやすい構文や、実用的なライブラリが豊富なことが挙げられ、実際に学びやすい言語です。

しかし、もしあなたが機械学習に興味があって、とくに知識も無いまま学習を進めると、挫折する可能性が高いと言えます。

機械学習の分野はプログラミング以外にも、専門的な知識や数学の知識も必要になります。ただなんとなく学習していると早い段階でつまづきやすく、そのまま挫折してしまうなんてことも…。

そのため、挫折しないためには、

  • 最適な学習環境を用意する
  • 必要なライブラリ・ツールを導入する
  • わからないことを質問できるメンターを見つける

などが必要になります。

効率よく学びたいなら、無料カウンセリングがおすすめ

このままPythonを学び続けていいのかな…
まだまだ知りたいことがたくさんある!
もっと詳しくPythonについて知りたい!

といった悩みや願望を持っている方は、弊社「侍エンジニア」をご利用下さい。

侍エンジニアでは、

  • 現役エンジニアによるマンツーマンレッスン
  • キャリアアドバイザーによる転職・就職支援
  • 業界屈指のフリーランス・起業サポート

を受けることができます。

業界屈指のコンサルタントから、効率的な学習方法や仕事獲得術、今後のキャリアまでさまざまな疑問を相談してみませんか?遠方の方でもオンラインで受講できます!お気軽に受講下さい。

侍エンジニア
無料カウンセリングを受ける

まとめ

今回は、PythonでOpenCVを使うために、opencv-pythonをインストールしました。

また、[OpenCVの代表的な機能として、sc name=”red”]顔検出(目検出も)、輪郭検出、エッジ検出、画像のヒストグラムの表示、円検出のコードを紹介しました。

ヒストグラムの表示では、コードを短くするためにmatplotlibをインストールしましたが、これはそのままOpenCV3matplotlibの相性が良いことを示しています。

このような画像処理は、今後増えていく機械学習関連のプロダクトで使うことになりますので、今のうちにOpenCVによる画像処理の基本を押さえておくのはとても大事なことでしょう。

頑張りましょう!

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次