Python
 Computer >> コンピューター >  >> プログラミング >> Python

OpenCVを使って画像・動画のエッジを検出するPythonプログラムの書き方

この記事では、Pythonを使って画像や動画ファイルからエッジ(輪郭)を検出する方法を解説します。エッジ検出には、コンピュータビジョン向けに設計されたオープンソースライブラリ「OpenCV」を使用します。OpenCVはもともとIntelによって開発されたライブラリで、BSDライセンスのもとで無料で利用できます。

OpenCVの機能を使うには、pipでインストールを行います。インストール時にNumPyモジュールも自動的にダウンロードされるため、別途用意する必要はありません。

sudo pip3 install opencv-python

今回の入力には動画ファイルを使用しますが、Webカメラを接続すれば、エッジ検出の効果をリアルタイムで確認することも可能です。

ここでは動画ファイルを使用します。元の映像(動画のフレーム)は以下のようになっています。

OpenCVを使って画像・動画のエッジを検出するPythonプログラムの書き方

エッジ検出の仕組み

エッジを検出するには、ピクセルの明るさが急激に変化している箇所を数学的に調べる必要があります。具体的には、画像のグレースケール版に対して勾配(グラディエント)を求めます。コンピュータビジョンの分野では、ピクセルが黒から白へ遷移する場合を「正の傾き」、白から黒へ遷移する場合を「負の傾き」として扱います。

画像の微分によるエッジ検出

画像は行列として保存されており、各要素にはすべてのピクセルに関する情報が格納されています。微分を求めるにはラプラシアン演算子が必要ですが、その前にまずSobel(ソーベル)微分を求めます。Sobel微分は、画像の勾配変化を取得するために使用されます。

水平方向のSobel微分(Sobel X)

Sobel微分は、元の画像とカーネルと呼ばれる別の行列との畳み込み演算によって得られます。単純なケースでは、カーネルは3×3の行列です。OpenCVにはsobel()関数が用意されており、これを使ってSobel微分を簡単に計算できます。Sobel Xを求める場合は、y方向の引数を0に設定します。

サンプルコード

import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4') # 動画ファイルからフレームを取得
while(capture.isOpened()): # 動画が終わるまでループを実行
   ret, frame = capture.read() # 動画からフレームを読み込む
   # BGRカラーをHSV(Hue Saturation Value)形式に変換
   hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
   # SobelXメソッド
   sobelx = cv2.Sobel(frame,cv2.CV_64F,1,0,ksize=5)
   cv2.imshow('SobelX',sobelx)
   k = cv2.waitKey(5) & 0xFF
   if k == 27: # 27はESCキーのASCIIコード。ESCキーが押されると終了
      break
capture.release()
cv2.destroyAllWindows() # ウィンドウを閉じた後にメモリを解放

実行結果

OpenCVを使って画像・動画のエッジを検出するPythonプログラムの書き方

垂直方向のSobel微分(Sobel Y)

同様に、sobel()関数を使って垂直方向のSobel微分を求めることもできます。この場合はx方向の引数を0にします。

サンプルコード

import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4') # 動画ファイルからフレームを取得
while(capture.isOpened()): # 動画が終わるまでループを実行
   ret, frame = capture.read() # 動画からフレームを読み込む
   # BGRカラーをHSV(Hue Saturation Value)形式に変換
   hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
   # SobelYメソッド
   sobely = cv2.Sobel(frame,cv2.CV_64F,0,1,ksize=5)
   cv2.imshow('SobelY',sobely)
   k = cv2.waitKey(5) & 0xFF
   if k == 27: # 27はESCキーのASCIIコード。ESCキーが押されると終了
      break
capture.release()
cv2.destroyAllWindows() # ウィンドウを閉じた後にメモリを解放

実行結果

OpenCVを使って画像・動画のエッジを検出するPythonプログラムの書き方

ラプラシアン微分

最後に、画像のラプラシアン微分について見ていきます。Laplacian()関数を使用することで、画像の微分を取得できます。

サンプルコード

import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4') # 動画ファイルからフレームを取得
while(capture.isOpened()): # 動画が終わるまでループを実行
   ret, frame = capture.read() # 動画からフレームを読み込む
   # BGRカラーをHSV(Hue Saturation Value)形式に変換
   hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
   # ラプラシアンメソッド
   laplacian = cv2.Laplacian(frame,cv2.CV_64F)
   cv2.imshow('Laplacian',laplacian)
   k = cv2.waitKey(5) & 0xFF
   if k == 27: # 27はESCキーのASCIIコード。ESCキーが押されると終了
      break
capture.release()
cv2.destroyAllWindows() # ウィンドウを閉じた後にメモリを解放

実行結果

OpenCVを使って画像・動画のエッジを検出するPythonプログラムの書き方
  1. PythonとOpenCVで実現するテンプレートマッチングの基本とマルチスケール対応

    テンプレートマッチングとは、実際の画像の中から、あらかじめ用意した小さな画像(テンプレート)と一致する部分を探し出す技術です。基本的にはパターンマッチングの一種であり、物体検出や顔認識など、さまざまなコンピュータビジョンのタスクの基礎となる手法です。PythonではOpenCVモジュールを使うことで、このマッチング処理を簡単に実装できます。本記事では、OpenCVのテンプレートマッチング機能を使った具体的な方法を解説します。OpenCVのインストールOpenCVの機能を利用するには、まずpipでライブラリをインストールします。sudo pip3 install opencv-python閾値(

  2. Python・OpenCVでヒストグラム平坦化を実装する方法|cv2.equalizeHist()の使い方

    ヒストグラム平坦化(Histogram Equalization)とは ヒストグラム平坦化は、画像処理において画像のヒストグラムを利用してコントラストを調整する手法です。 この手法は、多くの画像の全体的なコントラストを向上させる効果があります。特に、画像内の有効なデータが近いコントラスト値で表現されている場合に威力を発揮します。この調整を行うことで、輝度値がヒストグラム上により均等に分布するようになり、局所的にコントラストが低い領域でも高いコントラストを得られるようになります。 OpenCVの cv2.equalizeHist() 関数 OpenCVには、この処理を実行するための関数 cv2