画像・音声処理

Python + OpenCVで画像処理をマスター!使用法・実用例を解説

OpenCVを利用すれば、Pythonで画像処理を実装することができます。

OpenCVを利用している人で

  • そもそもOpenCVってなに?
  • OpenCVのインストール方法や使い方が分からない

という疑問を抱えている方も多いのではないでしょうか

そこで本記事では、PythonでOpenCVの「基礎知識やインストール方法」から「基本操作」、さらに「OpenCVの活用事例」を紹介します。

OpenCVの入門内容をまとめた記事となっているので、ぜひ最後までご覧ください。


本ブログを運営しているTech Teacherは、
プログラミング家庭教師サービスを運営しています。
完全マンツーマン・フルオーダーメイド
あなたが必要な指導を提供します。


本ブログを運営しているTech Teacherは、
プログラミング家庭教師サービスを運営しています。
完全マンツーマン・フルオーダーメイド
あなたが必要な指導を提供します。

OpenCVとは

OpenCVとは、「Open Source Computer Vision Library」の略です。

OpenCVは、画像や動画を処理するための機能がまとめて実装されているオープンソースのライブラリです。

元々OpenCVは、C/C++で動作するライブラリでした。

現在では、

  • C/C++
  • Python
  • Java
  • MATLAB

とった言語でOpenCVを導入することができます。

OpenCVはPythonで利用されることが多くなっているため、これからOpenCVを学習する方は「Python」を使うのがおすすめです。

PythonでOpenCVを使用するメリット

  • 本格的な画像処理が可能
  • コードが短くて読みやすい
  • コードの可読性が良い
  • matplotlibやnumpyなど他のライブラリと組み合わせやすい
  • エラーの原因を特定しやすい

といったことが挙げられます。

OpenCVのインストール方法

PythonでOpenCVを利用するためには「OpenCV-Pythonライブラリ」をインストールする必要があります。

OSによってインストール方法が違うため、ここでは「Windows」「MacOS」「Linux」の3つのOSでインストールする方法を紹介します。

Windows

Windowsの場合、最も簡単な「pip」でセットアップすることができます。

まず、Pythonのパッケージ管理ツールであるpipを最新のバージョンに更新します。

コマンドプロンプトを開き、次のコマンドを入力してください。

pip install --upgrade pip

次に、OpenCVをインストールします。

pip install -upgrade pip

Mac

Macの場合は、「Homebrew」を使用して簡単にインストールすることができます。

Homebrewをインストールしていない方は、まず、Homebrewをインストールしましょう。

ターミナルを開いて、次のコマンドを入力してください。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Homebrewを既にインストールしている方は、最新のバージョンにアップデートしましょう。

brew update

次に、Homebrewを使用してPythonをインストールします。

これにより、最新のPythonバージョンがインストールされます。

brew install python

Pythonのインストールが完了したら、OpenCVをインストールします。

pip install opencv-python

Linux

LinuxはOSによってインストール方法が違います。

ここでは代表として「Raspberry PI」でインストールする方法を紹介していきます。

Raspberry Piのターミナルを開いて、以下のコマンドを入力しましょう。

最初に、Raspberry Piのパッケージマネージャーを最新の状態に更新します。

sudo apt update
sudo apt upgrade

次に、Pythonをインストールします。

Raspberry Piには通常Pythonがプリインストールされていますが、最新バージョンを確認するために以下のコマンドを入力しましょう。

python3 --version

もしPython3がインストールされていない場合は、以下のコマンドを実行してPython 3をインストールしましょう。

sudo apt install python3

インストールできているかチェック

正しくOpenCVがインストールされているかをチェックするには、Pythonスクリプトの先頭に次のimport文を追加します。

import cv2

エラーが出力されなければインストールが完了しています。

インストールが出来ていなければ、「ImportError : No module named ‘cv2’」などのエラーが表示されます。

インストールできなかった方必見!

一人一人のPCの設定が異なるため、上記の方法でうまくインストールできない場合があります。

どんなに調べても、自分のPCにあった対処法が出てこない…

と、OpenCVの導入に苦労する人も多いでしょう。

・インストールできなかった方
・OpenCV・データサイエンスを学習したい方

このような方は、本blogを運営するプログラミングの家庭教師『Tech Teacher』にご相談ください。

質問・相談は無料です!以下のボタンから受け付けています!

不安がありましたら、是非お気軽にお問い合わせください!

OpenCVの機能

OpenCVには

  • 画像の読み込み・表示
  • 画像の作成・保存
  • 画像のトリミング・リサイズ・重ね合わせ
  • 画像の回転・上下反転・左右反転
  • グレースケール変換・色チャンネル分析・減色処理
  • モザイク処理・マスク処理・2枚の画像を合成
  • 図形の描画・文字の描画
  • ノイズ除去・平滑化・ぼかしフィルタ・メディアンフィルタ・ガウシアンフィルタ
  • 物体検出
  • テンプレートマッチング

といったさまざまな機能が備わっています。

pythonでは、

import cv2

と入力するだけで、OpenCVをインポートし、利用することができます。

それでは、実際にOpenCVの操作を紹介していきます。

うまくインストールできた方は、ぜひ自分のPCで実行してみてください。

画像の読み込み・表示

まず、画像処理において最も基本的な「画像の読み込み」・「ウィンドに表示」を紹介します。

画像を読み込むには、「cv2.imread()」を用います。

「cv2.imread()」に、読み込む画像の相対パスを渡しましょう。

import cv2

# 画像をimgに読み込み
# img = cv2.imread("ファイル名")
img = cv2.imread("Tech_Teacher_blog.jpeg")

#imgの中身を表示する
print(img)

上記のように、画像の情報を、[y][x][color]で表す配列が表示されます。

cv2 . imshow( )」は渡された画像を表示する関数です。

cv2 . waitKey( )」は画像を表示した後に、保持する関数です。

「cv2 . waitKey(x)」の「x」は、キー入力の秒数(ミリ秒)を指定しています。

すなわち、cv2 . waitKey(3)と入力した場合は3ミリ秒待って、次の行が実行されます。

cv2 . destroyAllWindows( )」は現在までに作成されたすべてのウインドウを閉じる関数です。

# 画像の出力
# cv2.imshow("ウィンドウ名",img)
cv2.imshow("Tech_Teacher_blog. jpeg",img)

# キーの入力を待つ
cv2.waitKey(0)

# ウィンドウを破壊する
cv2.destroyAllWindows()

上記の画像を表示することができました。

Enterキーなどを押すと「cv2 . destroyAllWindows( )」によって実行を終えることができます。

画像の色空間を変換

OpenCVを用いて、「赤、青、緑の三原色を混ぜて色を表現するRGBの画像」を「白から黒までの段階をグラデーションにより表現するグレースケール空間の画像」へ変換する方法を紹介します。

グレースケール変換は「画像を解析する前に、画像の色データをグレースケールに変換し、計算量を減らす工夫」のために用いられることが多いです。

OpenCVでは、「cv2.cvtColor()」という関数で色空間を変換します。

import cv2

# 画像をimgに読み込み
img = cv2.imread("Tech_Teacher_blog.jpeg")

#グレースケールへの変換
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#グレースケールの画像を表示
cv2.imshow("gray",img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

元の画像とグレースケールに変換した画像を比較すると上記のようになります。

cv2.cvtColor()を用いることで、右側のようなグレースケールに変換した画像を表示することができました。

また、グレースケール以外にも

cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

とコードを書くと、HSVの色空間に簡単に変換する事ができます。

図形/文字の描画

OpenCVには線や長方形、正方形、円、楕円、円弧、矢印、マーカー、文字など、様々な図形を描画する関数が用意されています。

そのため複雑なコードを書くことなく簡単に、図形や文字を描画する事ができます。

この機能は、物体を検出した位置を図示したりする時に重宝されます。

関数一覧表

文字を書く cv2.putText
長方形 cv2.rectangle
cv2.circle
楕円 cv2.ellipse
輪郭 cv2.drawContours
マーカー cv2.drawMaker
凸なポリゴン cv2.fillConvexPoly
ポリゴン cv2.fillPoly
ポリゴンの輪郭線 cv2.polylines
線文 cv2.line
矢印 cv2.arrowedLine

上記の関数を使って、画像中に図形の描画や文字を書き込むコードについて紹介していきます。

import cv2

#画像をimgに読み込む
img = cv2.imread("Tech_Teacher_blog.jpeg")

#ラインを書く
#cv2.line(入力画像,左上の座標,右下の座標,BGR値,太さ)
cv2.line(img,(50, 10), (125, 600), (255, 0, 0),2)

#長方形を書く
#cv2.rectangle(入力画像,左上の座標,右下の座標,BGR値,太さ)
cv2.rectangle(img,(100,25),(300,150),(0,255,0),3)

#円を書く
#cv2.circle(入力画像,円の中心座標,半径,BGR値,太さ)
cv2.circle(img,(800,100),150,(0,0,250),-1)

#楕円を書く
#cv2.ellipse(入力画像,中心座標,長軸,短軸,楕円の傾き具合,楕円を描画する始まりの角度,終わりの角度,BGR値,太さ)
cv2.ellipse(img,(800,300),(100,50),20,0,360,(255,0,0),3)

#文字を書く
#cv2.putText(入力画像,記述する文字,文字の座標,フォント,フォントスケール,BGR値,文字の太さ,線のタイプ)
cv2.putText(img, 'OpenCV', (450, 80), cv2.FONT_HERSHEY_COMPLEX, 3, (0, 255, 0), lineType=cv2.LINE_AA)

#画像を表示する
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像上に、簡単に文字や図形を描写することが出来ます。

Canny法によりエッジ検出

Canny法を用いたエッジ検出について紹介していきます。

エッジ検出とは

エッジ検出は、画像の物体の形状を調べるために、黒から白、白から黒などのように、画像の明暗が急激に変わる境目(エッジ)を検出する処理

エッジ検出にはCanny法が良く使われます。

Canny法を用いるメリットは、画像に入っているノイズを敬して、輪郭などのエッジを残す事ができるという点です。

この記事では、Canny法エッジ検出の実装について解説ていきます。

Canny法でエッジを検出するには「cv2 . Canny( )」を使用します。

入力画像はグレースケールではなくてはなりません。

グレースケール変換は、先ほど学習したcvtColor()を使う方法以外にも、imread(“ファイル名”,0)とすることでも実装することができます。

import cv2

#画像の読み込み
img = cv2.imread("img.jpg",0)

#Canny
img_canny = cv2.Canny(img,100,100)

#エッジ検出した画像の表示
cv2.imshow("canny",img_canny)
cv2.WaitKey(0)
cv2.destoryAllWindous()

cv2 . Canny( )」は入力画像に加えて二つの引数を持ちます。

cv2.Canny(“img”,threshold1,threshold2)と使います。

一つ目の引数(threshold1)は「ノイズを消すための閾値」を意味します。

二つ目の引数(threshold2)は「エッジが大きな輪郭が輪郭かどうかを判定する閾値」を意味します。

threshold1threshold2は画像データに対して、次の表のように機能します。

threshold2より大きい勾配 強いエッジとして検出される
threshold2より小さく
threshold1より大きい
勾配
弱いエッジとして検出される
threshold1より小さい勾配 エッジとして検出されない

顔を検出

ここでは、顔検出を実装します。

顔検出には、人の顔や猫の顔などを検出するために特に作り込まれた特徴であるHaar-likeがよく使用されます。

OpenCVでは、Haar-likeを使用した顔検出器がインストール時に同梱されているため、簡単に顔検出を実装することができます。

OpenCVの顔検出機能を使用するには、パスを指定してHaar-like特徴のファイル(.xml形式)を読み込む必要があります。

OpenCVの公式サイトからSourcesをダウンロードしましょう。

このファイルには、顔検出器が事前に学習された情報が含まれており、それを基に顔を検出します。

OpenCVのcv2.CascadeClassifierクラスを使用して、顔検出を行うことができます。

import cv2

# 対応したパスを指定
path = "img_face.jpeg"

# 学習済みの顔検出モデル(カスケード分類器)のパス
cascade_path = './haarcascades/haarcascade_frontalface_alt.xml'

# 画像を読み込む
img = cv2.imread(path)

# 画像をグレースケールに変換
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 学習済みモデルを読み込む
cascade = cv2.CascadeClassifier(cascade_path)

# 顔を検出する
face = cascade.detectMultiScale(img_gray)

for (x, y, w, h) in face:
    # 検出した顔の座標を取得し、四角形で囲む
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 3)

# 結果の画像を表示する
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

cascade_path = '/Users/sato/download/poencv-4.7.0/data/haarcascades'

にはインストール方法やOSなどによって異なるパスを指定する必要があります。

上記でダウンロードしたファイルから「haarcascades」をカレントディレクトリに移動させれば

cascade_path = './haarcascades/haarcascade_frontalface_alt.xml'

とパスを指定すれば大丈夫です。

またパスの指定を次の表のように変えれば、顔検出以外にも、さまざまな物体の検出が可能となります。

haarcascade_eye.xml
メガネ haarcascade_eye_tree_eyeglasses.xml
猫の顔 haarcascade_frontalcatface.xml
猫の顔(拡張版) haarcascade_frontalcatface_extended.xml
顔(標準) haarcascade_frontalface_alt.xml
顔(多様な顔と角度) haarcascade_frontalface_alt2.xml
笑顔 haarcascade_frontalface_alt2.xml
全身 haarcascade_fullbody.xml
上半身 haarcascade_upperbody.xml
下半身 haarcascade_lowerbody.xm
右目 haarcascade_righteye_2splits.xml
左目 haarcascade_lefteye_2splits.xml
ロシアのナンバープレート haarcascade_russian_plate_number.xml

ヒストグラムの描画

最後にヒストグラムを描画する方法を紹介します。

ヒストグラムを均一化すると、画像のコントラストをはっきりさせることができます。

ヒストグラムとは

ヒストグラムは、横軸にピクセル値の範囲縦軸にそのピクセル値の頻度や出現回数を表し、各ピクセル値の頻度を棒グラフで表現したものです。

ヒストグラムは、画像に「どんな色情報のピクセルが」「どれだけあるのか」を表したものと解釈すれば大丈夫です。

ヒストグラムはopencv-pythonだけで求めることができますが、可視化するのが大変なため、ここでは「matplotlib」を使用します。

# matplotlibのインストール
pip install matplotlib

ヒストグラムの描画

画像のヒストグラムを求めるには「cv.calcHist()」を使用します。

cv2.calcHist()関数を利用することで、引数に渡した画像を色相分府の行列に変換します。

import cv2
import matplotlib.pyplot as plt

# 画像の読み込み
img = cv2.imread('images.jpeg')
# ヒストグラムの計算
# cv2.calcHist(画像のリスト, チャンネル数, マスクの画像リスト, ヒストグラムの段階数のリスト、ヒストグラムの範囲のリスト)
colors = ('b', 'g', 'r')

for i, col in enumerate(colors):
    #ヒストグラムを求める
    hist = cv2.calcHist([img], [i], None, [256], [0, 256])
    
    #ヒストグラムをグラフで表示する
    plt.plot(hist, color=col)

plt.xlabel("pixel value")
plt.ylabel("Frequency")
plt.show()

ヒストグラム均一化

先程述べたように、ヒストグラムを均一化すると、画像のコントラストをはっきりさせることができます。

 ヒストグラムの均一化をするには「cv2.equalizeHist()」を使います。

import cv2
import matplotlib.pyplot as plt

# 画像の読み込み(グレースケール化)
img_gray = cv2.imread('images.jpeg',0)

#ヒストグラム均一化
img_eq= cv2.equalizeHist(img_gray)

#ヒストグラムを求める
hist_eq = cv2.calcHist([img_eq],[0],None,[256],[0,256])

#ヒストグラムをグラフで表示する
plt.plot(hist_eq)
plt.xlabel("pixel value")
plt.ylabel("Frequency")
plt.show()

cv2.imshow("equalize_img",img_eq)
cv2.waitKey(0)
cv2.destroyAllWindows()

このように、ヒストグラムを均一化すると画素値が満遍なく分布していることがわかります。

これにより、画像のコントラストが満遍なく分布しています。

最後に、ヒストグラム均一化を行った画像を表示します。

import cv2
import matplotlib.pyplot as plt

# 画像の読み込み(グレースケール化)
img_gray = cv2.imread('images.jpeg',0)

#ヒストグラム均一化
img_eq= cv2.equalizeHist(img_gray)

cv2.imshow("img_face",img_gray)
cv2.imshow("equalize_img",img_eq)
cv2.waitKey(0)
cv2.destroyAllWindows()

https://www.tech-teacher.jp/blog/image-processing-python/

OpenCVの応用

これまで、OpenCVのインストール法や基本の操作について説明しました。

最後に、「実際にOpenCVはどのようなことに応用できるか」紹介していきます。

顔検出と顔認識

前章で実装したように、OpenCVは「顔の検出や顔認識」をすることができます。

コンピューターは多くの画像を学習することにより、人の目や顔がどこにあるのか認識することが可能です

この機能は、「監視カメラ」「スマホのID認証」「写真アプリで人物ごとにアルバムを整理」、「表情分析アプリ」に応用できると考えられます。

物体検出とトラッキング

OpenCVは、画像や動画の中の物体を検出したり、動画の中を移動する物体の動きをトラッキング(追跡)したりすることができます。

この機能は「不審な動きを検出し、その人を追跡するセキリュティの強化」や「車線を認識、信号を検出する自動運転」に応用できると考えられます。

画像処理とフィルタリング

OpenCVは、画像の前処理やフィルタリングに使用されます。

例として、「画像のリサイズ回転ぼかし」といった機能が挙げられます。

これらの機能は「AIの学習するデータを水増し」、「学習するデータのノイズの削減」、「データのサイズの統一」、「モザイク処理」など機械学習にも応用されます。

『Tech Teacher』3つの魅力

魅力1. オーダーメイドのカリキュラ

『Tech Teacher』では、決められたカリキュラムがなくオーダーメイドでカリキュラムを組んでいます。「質問だけしたい」「相談相手が欲しい」等のご要望も実現できます。

    魅力2. 担当教師によるマンツーマン指導

    Tech Teacherでは完全マンツーマン指導で目標達成までサポートします。
    東京大学を始めとする難関大学の理系学生・院生・博士の教師がが1対1で、丁寧に指導しています。
    そのため、理解できない箇所は何度も分かるまで説明を受けることができます。

    魅力3. 3,960円/30分で必要な分だけ受講

    Tech Teacherでは、授業を受けた分だけ後払いの「従量課金制」を採用しているので、必要な分だけ授業を受講することができます。また、初期費用は入会金22,000円のみです一般的なプログラミングスクールとは異なり、多額な初期費用がかからないため、気軽に学習を始めることができます。

    まとめ

    ・魅力1. 担当教師によるマンツーマン指導

    ・魅力2. オーダーメイドのカリキュラム

    ・魅力3. 3,960円/30分で必要な分だけ受講

    質問のみのお問い合わせも受け付けております。

    データサイエンスを学ぶなら家庭教師Tech Teacher!

    『Tech Teacher』3つの魅力

    魅力1. オーダーメイドのカリキュラ

    『Tech Teacher』では、決められたカリキュラムがなくオーダーメイドでカリキュラムを組んでいます。「質問だけしたい」「相談相手が欲しい」等のご要望も実現できます。

      魅力2. 担当教師によるマンツーマン指導

      Tech Teacherでは完全マンツーマン指導で目標達成までサポートします。
      東京大学を始めとする難関大学の理系学生・院生・博士の教師がが1対1で、丁寧に指導しています。
      そのため、理解できない箇所は何度も分かるまで説明を受けることができます。

      魅力3. 3,960円/30分で必要な分だけ受講

      Tech Teacherでは、授業を受けた分だけ後払いの「従量課金制」を採用しているので、必要な分だけ授業を受講することができます。また、初期費用は入会金22,000円のみです一般的なプログラミングスクールとは異なり、多額な初期費用がかからないため、気軽に学習を始めることができます。

      まとめ

      ・魅力1. 担当教師によるマンツーマン指導

      ・魅力2. オーダーメイドのカリキュラム

      ・魅力3. 3,960円/30分で必要な分だけ受講

      質問のみのお問い合わせも受け付けております。