OpenCV中的边缘检测与轮廓提取方法

深夜诗人 2019-04-15 ⋅ 57 阅读

边缘检测和轮廓提取是计算机视觉中常见的任务,可以帮助我们识别图像中的物体边缘或形状。OpenCV是一个非常强大的开源计算机视觉库,提供了多种边缘检测和轮廓提取的方法。在本文中,我们将介绍一些常用的方法。

边缘检测方法

Canny边缘检测

Canny边缘检测是最常用和广泛应用的边缘检测算法之一。它有以下几个步骤:

  1. 首先,将图像转换为灰度图像。
  2. 然后,对图像进行高斯滤波,以平滑图像并去除噪声。
  3. 接下来,计算图像的梯度,即图像中每个像素点的梯度大小和方向。
  4. 再次对梯度进行非极大值抑制,以确保边缘细化。
  5. 最后,通过应用双阈值来检测和连接边缘。
import cv2

# 读取图像
img = cv2.imread('image.jpg', 0)

# 高斯滤波
blur = cv2.GaussianBlur(img, (3,3), 0)

# Canny边缘检测
edges = cv2.Canny(blur, 100, 200)

# 显示结果
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

Sobel边缘检测

Sobel算子是一种简单且常用的边缘检测算子,它计算图像的梯度。在x方向和y方向上的Sobel算子分别通过以下两个卷积核进行计算:

Sx = [[-1, 0, 1], 
      [-2, 0, 2], 
      [-1, 0, 1]]

Sy = [[-1, -2, -1], 
      [ 0,  0,  0], 
      [ 1,  2,  1]]
import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg', 0)

# Sobel边缘检测
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)

# 取绝对值并转换为无符号8位整数
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.convertScaleAbs(sobely)

# 结果相加
edges = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)

# 显示结果
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

轮廓提取方法

轮廓提取是在边缘检测的基础上,找出图像中的闭合轮廓。OpenCV中提供了findContours函数来实现轮廓提取。

import cv2

# 读取图像
img = cv2.imread('image.jpg')

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 进行阈值化
ret, thresh = cv2.threshold(gray, 127, 255, 0)

# 轮廓提取
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 在原图上绘制轮廓(参数为-1表示绘制所有轮廓)
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)

# 显示结果
cv2.imshow('Contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

总结

OpenCV中提供了多种边缘检测和轮廓提取的方法。Canny边缘检测是最常用的边缘检测算法之一,而Sobel边缘检测算子也是常见的边缘检测方法。轮廓提取通过findContours函数实现,可以对边缘进行进一步的处理,找出闭合轮廓。这些方法在计算机视觉中有着广泛的应用,可以帮助我们在图像中进行物体识别和形状分析。


全部评论: 0

    我有话说: