sysuyuhaibao 2019-02-20
图像边缘检测的任务在计算机视觉(CV)中非常常见。在本文中,我将演示如何使用Matlab / Octave和OpenCV库执行边缘检测,也用于实时视频处理。
我们将使用LennaSöderberg的标准测试图像。它是512x512 RGB图像。
原始图像
我们将把它转换成单色,因为图像必须是二维和灰度的。
原始图像转换为单色
要在Octave / Matlab中执行边缘检测,我们将使用图像包中的edge()函数。
结果:Canny算法具有默认参数
对于默认参数来说还不错,呵呵!
edge()函数至少将图像和方法作为参数。可选参数取决于所选方法。对于Canny算法,这些是在偏导数计算之前用于降噪的较低和较高阈值 - 和sigma 。您可能必须使用这些来获得更好的结果。
Octave图像包中支持的其他算法是:
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库允许实时轻松捕获和处理视频流。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库。