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

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

使用Octave进行边缘检测

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

51a3ddc0c55069bb7a7455f8e0a2d67b.png
6193b4c049b7c70e8631324303532684.png

原始图像

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

a582853ba183c5be86ec64dae03aed66.png
eea242653d84643abed285e55318a6f1.png

原始图像转换为单色

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

a5d1879fb7eff8642e6bd778e4ff3852.png
ca92eb1d17709752b5b58bfb643d5019.png

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

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

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

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

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

使用OpenCV进行图像边缘检测

Python代码实现如下:

import cv2from matplotlib import pyplot as pltimg = cv2.imread('cv_edge_detection/lena.png',0)plt.figure(figsize=(7,7))plt.axis('Off')plt.imshow(img, cmap='Greys_r');
14a71b29c02ea01488a5e798bcaab406.png
1416c7f111792e94efe821fe0961ccb8.png
imgEdge = cv2.Canny(img,80,200)plt.figure(figsize=(7,7))plt.axis('Off')plt.imshow(imgEdge, cmap='Greys_r');
f1e9558182425ad7251130ee31fb25e1.png
8aaeb1fb2d7646003bfe21df73b81fe5.png

Canny算法,阈值为80和200

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

使用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 memorycv2.destroyAllWindows() 
99a7ebfc14fbee7da8bcb090c4d527b2.png

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

07dab430d51df3f5693a76f6d61347a7.gif

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

结论

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值