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

OpenCVを使用して画像のエッジを検出するPythonプログラム


この問題では、Pythonが画像またはビデオファイルのエッジを検出する方法を確認します。これを実現するには、OpenCVライブラリが必要です。 OpenCVライブラリは、主にコンピュータビジョン用に設計されています。オープンソースです。もともとはIntelによって設計されました。これは、オープンソースBSDライセンスの下で無料で使用できます。

OpenCV機能を使用するには、pip。を使用してダウンロードする必要があります。 OpenCVはNumpyモジュールをダウンロードします。それも必要になります。

sudo pip3 install opencv-python

入力として、この場合、1つのビデオファイルを使用しました。ウェブカメラを使用して、このエッジ検出手順のリアルタイムの効果を確認することもできます。

ここではビデオファイルを使用しています。実際の画像(動画のフレーム)はこんな感じ-

<中央> OpenCVを使用して画像のエッジを検出するPythonプログラム

エッジ検出の仕組み

エッジを検出するために、ピクセルの明るさが明確に変化しているかどうかを確認するための数学的観察がいくつかあります。

画像のグレースケールバージョンのグラデーションを見つける必要があります。コンピュータビジョンでは、ピクセルが黒から白に移行するとき、それは正の傾きとして示されます。白から黒への遷移の場合、これは負の勾配です。

画像の導関数を使用したエッジ検出

画像はマトリックスとして保存され、そのマトリックスの各要素はすべてのピクセルに関する情報を保持します。導関数を見つけるには、ラプラシアン演算子が必要です。したがって、ラプラシアンを取得するには、最初にSobel導関数が必要です。これらのSobel導関数は、画像の勾配変化を取得するために使用されます。

水平ソーベル導関数(ソーベルX)

このSobel導関数は、実際の画像と別の行列(カーネルと呼ばれる)の畳み込みによって取得されます。カーネルは単純な場合の3x3マトリックスです。

sobel()という関数があります 。この関数を使用して、sobel導関数を見つけることができます。 Sobel xを取得しようとすると、y部分は0になります。

サンプルコード

import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4') #Capture frames from video file.
while(capture.isOpened()): # Run the loop until the video ends
   ret, frame = capture.read() #Fetch the frames from video
   # Convert BGR color to (Hue Saturation Value) mode
   hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
   # The Sobelx Method
   sobelx = cv2.Sobel(frame,cv2.CV_64F,1,0,ksize=5)
   cv2.imshow('SobelX',sobelx)
   k = cv2.waitKey(5) & 0xFF
   if k == 27: #27 is the ASCII for ESC key. When ESC is pressed, it will stop
      break
capture.release()
cv2.destroyAllWindows() #Clean memory after removing the windows

出力

<中央> OpenCVを使用して画像のエッジを検出するPythonプログラム

垂直ソーベル導関数(ソーベルY)

同様に、sobel()関数を使用して垂直Sobel導関数を見つけることができます。この場合、x部分は0になります。

サンプルコード

import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4') #Capture frames from video file.
while(capture.isOpened()): # Run the loop until the video ends
   ret, frame = capture.read() #Fetch the frames from video
   # Convert BGR color to (Hue Saturation Value) mode
   hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
   # The Sobely Method
   sobely = cv2.Sobel(frame,cv2.CV_64F,0,1,ksize=5)
   cv2.imshow('SobelY',sobely)
   k = cv2.waitKey(5) & 0xFF
   if k == 27: #27 is the ASCII for ESC key. When ESC is pressed, it will stop
      break
capture.release()
cv2.destroyAllWindows() #Clean memory after removing the windows

出力

<中央> OpenCVを使用して画像のエッジを検出するPythonプログラム

ラプラシアン誘導体

最後に、画像のラプラシアン導関数が表示されます。 Laplacian()という関数があります。導関数を取得するために使用されます。

サンプルコード

import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4') #Capture frames from video file.
while(capture.isOpened()): # Run the loop until the video ends
   ret, frame = capture.read() #Fetch the frames from video
   # Convert BGR color to (Hue Saturation Value) mode
   hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
   # The Laplacian Method
   laplacian = cv2.Laplacian(frame,cv2.CV_64F)
   cv2.imshow('Laplacian',laplacian)
   k = cv2.waitKey(5) & 0xFF
   if k == 27: #27 is the ASCII for ESC key. When ESC is pressed, it will stop
      break
capture.release()
cv2.destroyAllWindows() #Clean memory after removing the windows

出力

<中央> OpenCVを使用して画像のエッジを検出するPythonプログラム
  1. PythonでOpenCVを使用したテンプレートマッチング

    テンプレートマッチングは、パッチまたはテンプレートを実際の画像からマッチングできる手法です。これは基本的にパターンマッチングメカニズムです。 PythonにはOpenCVモジュールがあります。 openCVを使用すると、一致するものを簡単に見つけることができます。したがって、この問題では、OpenVCテンプレートマッチング手法が使用されます。 OpenCV機能を使用するには、 pipを使用してダウンロードする必要があります 。 sudo pip3 install opencv-python テンプレートマッチングタスクには、精度係数があります。この係数はしきい値と呼ばれます。一例とし

  2. PythonOpenCvモジュールを使用したヒストグラムの等化

    これは、画像のヒストグラムを使用してコントラスト調整を行う画像処理の方法です。 実際、この方法は通常、多くの画像のグローバルコントラストを増加させます。特に、画像の使用可能なデータが近いコントラスト値で表される場合、この調整により、強度をヒストグラム上でより適切に分散でき、ローカルコントラストの低い領域が可能になります。より高いコントラストを得る。 OpenCVにはこれを行う関数cv2.equalizeHist()があり、その入力は単なるグレースケール画像であり、出力はヒストグラム均等化された画像です。 この手法は、画像のヒストグラムが特定の領域に限定されている場合に適しています。強度の