OpenCVとは、非常に強力なオープンソースの画像動画ライブラリだ。今回は、PythonからOpenCVを利用して、簡単な画像処理を行う方法を紹介する。特に、画像に様々なフィルタ処理を施す方法を見てみよう。

  • OpenCVを用いて画像にいろいろな処理を行ったところ

    OpenCVを用いて画像にいろいろな処理を行ったところ

OpenCVについて

OpenCV(Open Source Computer Vision Library)は、画像や動画を処理するのに必要な様々な機能を提供するライブラリだ。画像の変換やフィルタ処理や変形、物体判定や物体認識や顔認識、カメラの入出力など豊富な機能が備わっている。そのため、画像や動画に関係する処理をするときに大変役に立つライブラリだ。

しかも、名前に『オープン』を関しているだけあって、オープンソース(BSDライセンス)であり、商用利用も可能なので、幅広く利用されている。加えて、マルチプラットフォームで、Windows、macOS、Linuxと様々なOSの上で動かすことができる。また、Raspberry PiのようなIoT機器にもインストールして利用することができる。

  • OpenCVのWebサイト

    OpenCVのWebサイト

OpenCVのWebサイト
[URL] https://opencv.org

OpenCVのインストール

PythonからOpenCVを利用する場合、便利なことにパッケージにまとめられている。そのため、Pythonに加えて、OpenCVのモジュールをインストールするだけで使えるようになる。

なお、最も手っ取り早くOpenCVを使うには、Googleが無料で提供しているPythonの開発環境のColaboratoryを使うこともできる。しかし、次回、OpenCVからPCにつないだWebカメラなども操作してみたいので、ローカルPC環境にOpenCVをインストールする方法を紹介しよう。

以下は、既にPython3.5以上がインストールされていることを前提にしている。本連載の14回目『最新Anaconda5でPython開発環境を全部揃えよう』を参考に、Anacondaをインストールした上でOepnCVをインストールしよう。

【Windowsの場合】

コマンドライン(Anaconda Prompt)から、pipコマンドを利用して、OpenCVをインストールできる。

pip install opencv-python
  • pipコマンドからOpenCVを手軽にインストール

    pipコマンドからOpenCVを手軽にインストール

【macOSの場合】

macOSの場合は、Homebrewを利用してインストールするのが楽だ。ターミナル.appを起動して、以下のコマンドを実行しよう。なお、Homebrewがインストールされていなければ、こちらのページを参考にしてインストールしてみよう。

brew install opencv

あるいは、Anacondaのパッケージマネージャーを利用して、次のようにして、OpenCVをインストールできる。

conda config --add channels conda-forge
conda install opencv

インストールできたかどうか確かめてみよう

正しく、OpenCVがインストールされているかどうかは、コマンドラインから、Pythonの対話型実行環境を実行し、OpenCVのライブラリcv2が利用できるかどうかを確かめれば良い。コマンドラインを起動し、Windowsならば「python」コマンドを、macOSならば「python3」コマンドを実行しよう。対話型実行環境が起動すると「>>>」とプロンプトが表示されるので、以下のように入力してみよう。

import cv2

もし、インストールが無事できてれば、何もエラーは出ない。うまくインストールできていない場合には、「ImportError: No module named 'cv2'」などのエラーが表示されるだろう。

OpenCVで画像を読み込んでみよう

まずは、今回サンプルプログラムで利用する、画像をダウンロードしておこう。対話型実行環境で、以下のプログラムを実行しよう。すると、画像ファイルをダウンロードして「hama.jpg」というファイル名で保存する。

import urllib.request as req
url = "http://uta.pw/gazoubbs/attach/12-hama.jpg"
local = "hama.jpg"
req.urlretrieve(url, local)

それでは、いよいよ、OpenCVで画像データを読み出してみよう。データを読み出すには、cv2.imread()関数を利用する。ここでは、読み出した画像のデータのサイズを表示するプログラムを紹介しよう。うまく読み出せるだろうか。

import cv2
img = cv2.imread("hama.jpg")
print(img.shape)

プログラムを実行すると、以下のように表示される。これは、縦803ピクセル、横1071ピクセル、色の深さはRGBの3色を表す。

(803, 1071, 3)

白黒画像に変換してみよう

OpenCVには、色を変換するcv2.cvtColor()関数が用意されているので、これを利用すれば、手軽にカラー画像を白黒画像に変換できる。ここでは、白黒256階調(グレイスケール)に変換してみよう。

import cv2
img = cv2.imread("hama.jpg")
# グレイスケールに変換
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# ファイルに保存
cv2.imwrite("hama-gray.jpg", gry)

プログラムを実行すると、次のようにグレイスケールに変換した画像が「hama-gray.jpg」という名前で保存される。

  • グレイスケールに変換したところ

    グレイスケールに変換したところ

ソーベルフィルタを使ってみよう

上記のcv2.cvtColor()は色を変換するだけだが、OpenCVには、いろいろなフィルタが備わっているので使ってみよう。ここでは、ソーベルフィルタを利用してみる。

import cv2
img = cv2.imread("hama.jpg")
# ソーベルフィルタを適用
img2 = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=5)
# ファイルに保存
cv2.imwrite("hama-sobel.jpg", img2)

上記のプログラムを実行すると、フィルタを適用し「hama-sobel.jpg」という名前で保存する。保存した画像は次のようになる。

  • ソーベルフィルタを適用してみたところ

    ソーベルフィルタを適用してみたところ

似たようなものだが、cv2.Canny()関数を利用して、Cannyフィルタを利用すると以下のようになる。

import cv2
img = cv2.imread("hama.jpg")
# Cannyフィルタを適用
img2 = cv2.Canny(img, 30, 200)
# ネガポジ反転
img2 = 256 - img2
# ファイルに保存
cv2.imwrite("hama-canny.jpg", img2)

実行すると、以下のように表示される。

  • Cannyフィルタを適用したところ

    Cannyフィルタを適用したところ

ちなみに、上記でネガポジ反転の処理を行っているが、ネガポジ反転は、OpenCVの力を借りずとも、Pythonの演算だけで処理できるのが良いところだ。なお、Cannyフィルタなしで、ネガポジ反転だけを行うと以下のようになる。

# ネガポジ反転
img2 = 256 - img
cv2.imwrite("hama-nega.jpg", img2)

保存された画像を見てみよう。

  • ネガポジ反転したところ

    ネガポジ反転したところ

まとめ

以上、今回は、OpenCVについて紹介した。フィルタをかけたり、色を変換したりと、OpenCVを使うと、画像を手軽に処理することができることが分かっただろう。また、OpenCVでは、画像だけでなく、PCに接続したWebカメラから画像を抜き出して処理することもできる。次回、その方法を紹介するので、お楽しみに。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。