- OpenCV Python 教程
- OpenCV Python - 首页
- OpenCV Python - 概述
- OpenCV Python - 环境配置
- OpenCV Python - 读取图像
- OpenCV Python - 写入图像
- OpenCV Python - 使用 Matplotlib
- OpenCV Python - 图像属性
- OpenCV Python - 按位运算
- OpenCV Python - 形状和文本
- OpenCV Python - 鼠标事件
- OpenCV Python - 添加轨迹条
- OpenCV Python - 调整大小和旋转
- OpenCV Python - 图像阈值化
- OpenCV Python - 图像滤波
- OpenCV Python - 边缘检测
- OpenCV Python - 直方图
- OpenCV Python - 颜色空间
- OpenCV Python - 图像变换
- OpenCV Python - 图像轮廓
- OpenCV Python - 模板匹配
- OpenCV Python - 图像金字塔
- OpenCV Python - 图像加法
- OpenCV Python - 图像混合
- OpenCV Python - 傅里叶变换
- OpenCV Python - 捕捉视频
- OpenCV Python - 播放视频
- OpenCV Python - 从视频提取图像
- OpenCV Python - 从图像生成视频
- OpenCV Python - 人脸检测
- OpenCV Python - 均值漂移/CamShift
- OpenCV Python - 特征检测
- OpenCV Python - 特征匹配
- OpenCV Python - 数字识别
- OpenCV Python 资源
- OpenCV Python - 快速指南
- OpenCV Python - 资源
- OpenCV Python - 讨论
OpenCV Python - 边缘检测
这里的边缘指的是图像中物体的边界。OpenCV 有一个 **cv2.Canny()** 函数,通过实现 Canny 算法来识别图像中各种物体的边缘。
Canny 边缘检测算法是由 John Canny 开发的。根据该算法,物体的边缘是通过执行以下步骤确定的:
第一步是减少图像中的噪声像素。这是通过应用 5X5 高斯滤波器来实现的。
第二步涉及找到图像的强度梯度。第一阶段的平滑图像通过应用 Sobel 算子进行滤波,以获得水平和垂直方向的一阶导数(Gx 和 Gy)。
均方根值给出边缘梯度,导数的反正切比给出边缘的方向。
$$\mathrm{边缘梯度G\:=\:\sqrt{G_x^2+G_y^2}}$$
$$\mathrm{角度\:\theta\:=\:\tan^{-1}(\frac{G_{y}}{G_{x}})}$$
获得梯度幅值和方向后,对图像进行全扫描以去除可能不构成边缘的任何不需要的像素。
下一步是使用 minval 和 maxval 阈值执行滞后阈值化。小于 minval 和 maxval 的强度梯度是非边缘,因此被丢弃。介于两者之间的像素根据其连通性被视为边缘点或非边缘点。
所有这些步骤都由 OpenCV 的 cv2.Canny() 函数执行,该函数需要输入图像数组以及 minval 和 maxval 参数。
示例
以下是 Canny 边缘检测的示例。相应的程序如下所示:
import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('lena.jpg', 0) edges = cv.Canny(img,100,200) plt.subplot(121),plt.imshow(img,cmap = 'gray') plt.title('Original Image'), plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(edges,cmap = 'gray') plt.title('Edges of original Image'), plt.xticks([]), plt.yticks([]) plt.show()
输出
广告