- 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 - 图像Pyramid
- OpenCV Python - 图像相加
- OpenCV Python - 图像混合
- OpenCV Python - 傅里叶变换
- OpenCV Python - 捕获视频
- OpenCV Python - 播放视频
- OpenCV Python - 视频图像
- OpenCV Python - 来自图像的视频
- OpenCV Python - 人脸检测
- OpenCV Python - Meanshift/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算子进行滤波以获得水平和垂直方向的一阶导数(G x和G y)。
均方根值给出边缘梯度,导数的 tan 反比给出边缘方向。
$$\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 参数。
例子
这是精明边缘检测的示例。其程序如下 -
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()