使用 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.