使用 OpenCV 的 Python 程式檢測影像邊緣


在這個問題中,我們將瞭解 Python 如何檢測影像或影片檔案的邊緣。為了實現這一點,我們需要 OpenCV 庫。OpenCV 庫主要用於計算機視覺。它是開源的。最初由英特爾設計。它可以在開源 BSD 許可證下免費使用。

要使用 OpenCV 功能,我們需要使用 **pip** 下載它們。OpenCV 將下載 Numpy 模組。這也將需要。

sudo pip3 install opencv-python

作為輸入,在本例中,我們使用了一個影片檔案。我們還可以使用我們的網路攝像頭來檢視此邊緣檢測過程的即時效果。

這裡我們使用的是影片檔案。實際影像(影片幀)如下所示:

Image Frame

邊緣檢測如何工作?

為了檢測邊緣,有一些數學觀察來檢查畫素的亮度是否發生了明顯的變化。

我們需要找到影像灰度版本的梯度。在計算機視覺中,當畫素從黑色過渡到白色時,它被記為正斜率。對於從白色到黑色的過渡,它是一個負斜率。

使用影像導數進行邊緣檢測

影像儲存為矩陣,其中該矩陣的每個元素都儲存有關所有畫素的資訊。要找到導數,我們需要拉普拉斯運算元。因此,為了獲得拉普拉斯運算元,首先我們需要索貝爾導數。這些索貝爾導數用於獲取影像的梯度變化。

水平索貝爾導數(Sobel X)

此索貝爾導數是透過實際影像與另一個矩陣(稱為核心)的卷積獲得的。對於簡單情況,核心是 3x3 矩陣。

有一個名為 **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

輸出

Sobel

垂直索貝爾導數(Sobel Y)

類似地,我們可以使用 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

輸出

Vertical Sobel

拉普拉斯導數

最後,我們將看到影像的拉普拉斯導數。有一個名為 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

輸出

Laplacian

更新於: 2019-07-30

529 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.