计算机视觉中的边缘检测示例

图像边缘检测的任务在计算机视觉(CV)中非常常见。在本文中,我将演示如何使用Matlab / Octave和OpenCV库执行边缘检测,也用于实时视频处理。

使用Octave进行边缘检测

我们将使用LennaSöderberg的标准测试图像。它是512x512 RGB图像。

计算机视觉中的边缘检测示例

计算机视觉中的边缘检测示例

原始图像

我们将把它转换成单色,因为图像必须是二维和灰度的。

计算机视觉中的边缘检测示例

计算机视觉中的边缘检测示例

原始图像转换为单色

要在Octave / Matlab中执行边缘检测,我们将使用图像包中的edge()函数。

计算机视觉中的边缘检测示例

计算机视觉中的边缘检测示例

结果:Canny算法具有默认参数

对于默认参数来说还不错,呵呵!

edge()函数至少将图像和方法作为参数。可选参数取决于所选方法。对于Canny算法,这些是在偏导数计算之前用于降噪的较低和较高阈值 - 和sigma 。您可能必须使用这些来获得更好的结果。

Octave图像包中支持的其他算法是:

  • Kirsch
  • Lindeberg — after Tony Lindeberg
  • LoG — Laplacian of Gaussian
  • Roberts
  • Prewitt
  • zerocross
  • Andy — after Andy Adlers

使用OpenCV进行图像边缘检测

Python代码实现如下:

import cv2
from matplotlib import pyplot as plt
img = cv2.imread('cv_edge_detection/lena.png',0)
plt.figure(figsize=(7,7))
plt.axis('Off')
plt.imshow(img, cmap='Greys_r');

计算机视觉中的边缘检测示例

计算机视觉中的边缘检测示例

imgEdge = cv2.Canny(img,80,200)
plt.figure(figsize=(7,7))
plt.axis('Off')
plt.imshow(imgEdge, cmap='Greys_r');

计算机视觉中的边缘检测示例

计算机视觉中的边缘检测示例

Canny算法,阈值为80和200

plt.figure(figsize=(7,7))
plt.axis('Off')
plt.imshow(imgEdge, cmap='Greys');

计算机视觉中的边缘检测示例

计算机视觉中的边缘检测示例

使用OpenCV进行实时视频边缘检测

OpenCV库允许实时轻松捕获和处理视频流。Python实现的示例代码如下:

import cv2 
import numpy as np 
 
# capture frames from a camera 
cap = cv2.VideoCapture(0) 
 
# loop runs if capturing has been initialized 
while(1): 
 
 # reads frames from the camera 
 ret, frame = cap.read() 
 
 # convert BGR to HSV 
 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) 
 
 # define range of red color in HSV 
 lower_red = np.array([30,150,50]) 
 upper_red = np.array([255,255,180]) 
 
 # create a red HSV colour boundary and 
 # threshold HSV image 
 mask = cv2.inRange(hsv, lower_red, upper_red) 
 
 # Bitwise-AND mask and original image 
 res = cv2.bitwise_and(frame,frame, mask= mask) 
 
 # Display the original image 
 cv2.imshow('Original',frame) 
 
 # find edges in the input image and 
 # mark them in the output map edges 
 edges = cv2.Canny(frame,100,200) 
 
 # Display edges in a frame 
 cv2.imshow('Edges',edges) 
 
 # Wait for Esc key to stop 
 k = cv2.waitKey(5) & 0xFF
 if k == 27: 
 break
 
# Close the capture 
cap.release() 
 
# De-allocate any associated memory
cv2.destroyAllWindows()

计算机视觉中的边缘检测示例

这是视频流边缘检测的结果。

计算机视觉中的边缘检测示例

使用OpenCV对视频流进行实时边缘检测

结论

因此,我们可以认识到,边缘检测是一项可做的任务,即使对于实时视频处理,也可以容易地使用强大的OpenCV库。

相关推荐