RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【初心者向け】PythonとOpenCVで画像処理を体験してみよう

初めに

皆さん初めましてmosyoryです。
画像処理に興味はあるがどうやってやるのかわからない、そんな方もいるのではないでしょうか。
本記事ではWindowsMacの環境でPythonOpenCVを使ってちょっとした画像処理の方法を紹介したいと思います。関数等の詳細な解説は行っていないので予めご了承ください。

OpenCVとは

OpenCV(Open Source Computer Vision Library)とはオープンソースコンピュータ・ビジョン・ライブラリです。
画像処理や汎用的な数学処理、機械学習に関するアルゴリズムが多数含まれています。 C+、PythonJavaでサポートされておりWindowsLinuxOS XAndroidiOSなどの様々なプラットフォームに対応しています。
BSD 3-Clauseラインセンスでリリースされているので商用利用も可能です。 opencv.org

OpenCVのインストール

まずはOpenCVのインストールから行います。WindowsMacでの方法を紹介しますのでお持ちのパソコンに合わせて行ってください。Pythonはすでにインストールされている前提で進めますのでまだの方はPython公式サイトからPython3.xのバージョンをインストールしてください。本記事ではPython3.9で進めています。 www.python.org

Windows

コマンドプロンプトからpipを使用してインストールします。pipはPythonのパッケージ管理ツールでPython3.4以上なら標準で付属していますので別途インストールする必要はありません。
PythonOpenCVはNumpyというライブラリを使用しますのでこちらもインストールします。OpenCVをインストールするとNumpyの最新バージョンも自動でインストールしてくれるのですがブログ作成時はWindows10 2004とNumpy1.19.4の組み合わせだとPythonプログラムを実行した際にエラーになります。
なのでバージョン1.19.3を指定してインストールしましょう。

pip install numpy==1.19.3
pip install opencv-python

Mac

ターミナルからpipでインストールします。以前はHomeBrewからOpenCVを入れていましたが今はpipだけでインストールできるようになりました。 MacはNumpy1.19.4でも問題なく動くのでOpenCVのインストール時にNumpyも自動でインストールしてもらいましょう。

pip install opencv-python

pipでインストールできない

pipでOpenCVをインストールしようとするとこんなエラーが出る時があります。

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)'))': /simple/opencv-python/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)'))': /simple/opencv-python/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)'))': /simple/opencv-python/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)'))': /simple/opencv-python/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)'))': /simple/opencv-python/
Could not fetch URL https://pypi.org/simple/opencv-python/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/opencv-python/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)'))) - skipping
ERROR: Could not find a version that satisfies the requirement opencv-python
ERROR: No matching distribution found for opencv-python

どうやらPythonパッケージを管理しているPyPIとの通信でSSLに問題があるらしく接続先を指定する必要があるそうです。 なのでpipを使う時にオプションを設定してインストールしましょう。

pip install opencv-python --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --trusted-host pypi.org

基本操作

ここでは画像処理を行うための基本操作を紹介します。画像はお好きなものを用意してください。
今回はOpenCVのアイコン画像を使って例をお見せします。
まず最初にOpenCVPythonのプログラム内で使えるようにインポートしましょう。

import cv2

読み込み

画像の読み込みではcv2.imread()を使います。引数は画像のファイル名です。
異なるディレクトリにファイルがある場合は絶対パス相対パスで指定してください。
パスが間違っていてもエラーにならず処理は継続されるので注意しましょう。

img = cv2.imread('OpenCV.png')

表示

画像をウィンドウに表示するにはcv2.imshow()を使います。
引数にウィンドウの名前、表示したい画像を指定してください。
表示する際にはcv2.waitKey()とcv2.destroyAllWindows()も一緒に書きましょう。
この2つはキーボード入力を受け付ける関数と作成したすべてのウィンドウを閉じる関数です。
cv2.imshow()だけではウィンドウは表示された後すぐに消えてしまいますが、続けて2つの関数を書くことでキーボード入力が行われるまでウィンドウが表示され続けます。
画像は左がWindows、右がMacで表示した際のウィンドウになります。

cv2.imshow('OpenCV', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

保存

保存はcv2.imwrite()を使います。引数に保存する画像のファイル名、保存したい画像を指定します。

cv2.imwrite('save.png', img)

画像処理

それでは画像処理を行っていきます。
今回は色空間の変更、二値化処理、輪郭検出・描画の方法をPythonプログラムと結果画像と併せて紹介します。

色空間の変換

色空間(カラースペース)とは特定の色を数値などのパラメーターで表したものです。RGBやHSVのことですね。
OpenCVでは画像はBGRで読み込まれますが画像処理の内容によっては別の方が適している場合があります。
そんな時はcv2.cvtColor()を使いましょう。引数に色空間を変更したい画像、色変換のフラグを指定してください。
よく使用する変換フラグはcv2.COLOR_△△2○○という形式で用意されており△△が変更前、○○が変換後の色空間の名前になります。

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  #BGR → グレースケール

二値化処理

二値化処理とはグレースケール画像に対し閾値を設け白黒画像に変換することです。
二値化処理にはcv2.threshold()を使います。引数にグレースケール画像、閾値閾値以上(フラグによっては値以下)の画素に割り当てる値、閾値処理を行うフラグを指定することで閾値と二値化画像を返します。
下のPythonコードは画素が127以上なら白に、以下なら黒に変換しています。

ret, thresh = cv2.threshold(gray, 127,255, cv2.THRESH_BINARY_INV)


OpenCVの緑のマークが映らなくなりましたね。

輪郭検出

輪郭検出はcv2.findContours()を使います。引数に二値化画像、輪郭を検索するモード、輪郭検出方法のフラグを指定し実行することで輪郭と輪郭の階層情報を返します。
OpenCVは黒の背景から白の物体の輪郭を探すことを前提としているので使用する二値化画像に気を付けましょう。

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

contoursに検出された全輪郭がlistで格納されています。

輪郭描画

描画にはcv2.drawContours()を使います。
引数に画像、listに格納された輪郭、描画したい輪郭のインデックス、描画する色と線の太さを指定します。
下のPythonコードは全ての輪郭を線の太さ3の紫色で描画しています。

cv2.drawContours(img, contours, -1, (255, 0, 255), 3)


OpenCVの文字と赤、青のマークに紫色の輪郭線が描画されましたね。

終わりに

PythonOpenCVを使った画像処理の例を紹介しました。
今回は色の変換や描画となりましたが、OpenCVでは人の顔の検出や機械学習など多くのことができるようになっています。 公式のドキュメントにもPythonのサンプルコード付きで説明がありますので詳しい処理内容を知りたい方はそちらをご覧になってください。

参考サイト

OpenCV: OpenCV-Python Tutorials

Pythonによる画像処理に利用するライブラリを現役エンジニアが解説【初心者向け】 | TechAcademyマガジン

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

Pythonで画像処理をするならOpenCVがオススメ! | 侍エンジニアブログ


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.