初めに
皆さん初めましてmosyoryです。
画像処理に興味はあるがどうやってやるのかわからない、そんな方もいるのではないでしょうか。
本記事ではWindows・Macの環境でPythonとOpenCVを使ってちょっとした画像処理の方法を紹介したいと思います。関数等の詳細な解説は行っていないので予めご了承ください。
OpenCVとは
OpenCV(Open Source Computer Vision Library)とはオープンソースコンピュータ・ビジョン・ライブラリです。
画像処理や汎用的な数学処理、機械学習に関するアルゴリズムが多数含まれています。
C+、Python、JavaでサポートされておりWindows、Linux、OS X、Android、iOSなどの様々なプラットフォームに対応しています。
BSD 3-Clauseラインセンスでリリースされているので商用利用も可能です。
opencv.org
OpenCVのインストール
まずはOpenCVのインストールから行います。WindowsとMacでの方法を紹介しますのでお持ちのパソコンに合わせて行ってください。Pythonはすでにインストールされている前提で進めますのでまだの方はPython公式サイトからPython3.xのバージョンをインストールしてください。本記事ではPython3.9で進めています。 www.python.org
Windows
コマンドプロンプトからpipを使用してインストールします。pipはPythonのパッケージ管理ツールでPython3.4以上なら標準で付属していますので別途インストールする必要はありません。
PythonのOpenCVは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のアイコン画像を使って例をお見せします。
まず最初にOpenCVをPythonのプログラム内で使えるようにインポートしましょう。
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の文字と赤、青のマークに紫色の輪郭線が描画されましたね。
終わりに
PythonとOpenCVを使った画像処理の例を紹介しました。
今回は色の変換や描画となりましたが、OpenCVでは人の顔の検出や機械学習など多くのことができるようになっています。
公式のドキュメントにもPythonのサンプルコード付きで説明がありますので詳しい処理内容を知りたい方はそちらをご覧になってください。
参考サイト
OpenCV: OpenCV-Python Tutorials
Pythonによる画像処理に利用するライブラリを現役エンジニアが解説【初心者向け】 | TechAcademyマガジン
画像処理をマスターしよう!PythonでOpenCVを使う方法を紹介! | TechTeacher Blog
Pythonで画像処理をするならOpenCVがオススメ! | 侍エンジニアブログ
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com