CV:边缘检测的算法包含 Prewitt、Sobel、Laplacian 和 Canny。

目录

[1. 边缘检测(Prewitt)](#1. 边缘检测(Prewitt))

[2. 边缘检测(Sobel)](#2. 边缘检测(Sobel))

[3. 边缘检测(Laplacian)](#3. 边缘检测(Laplacian))

[3. 边缘检测(Canny)](#3. 边缘检测(Canny))


边缘检测的算法包含 Prewitt、Sobel、Laplacian 和 Canny。

人在图像识别上具有难以置信的能力,可以在几毫秒内处理图像,确定图像的边缘、图像内物体的位置和标签。研究者让计算机模拟人检测图像的边缘,是在图像中找到变化明显的区域,也就是像素明显变化的点或区域。

1. 边缘检测(Prewitt)

接下来用黑白像素值介绍如何获得图像的边缘,先建立一个全为 0 的三维数组,维度分别为行、列、通道数,其中 2 列的值再赋值为 255,用以下代码实现,效果展示如 1 下,黑色与白色的接壤的区域的像素值变化巨大。

从黑色到白色(0 到 255)的过渡是正斜率,而从白色到黑色(255 到 0)的过渡是负斜率。梯度指向增长率最大的方向,其大小是该方向上的斜率,可以通过灰度图像的梯度可以找到变化巨大的像素值。

图1:黑白图像

不考虑图像通道数的情况下,假设图像是二维离散函数 f(x,y),图像梯度是在 x 和 y 方向求导,求导之后的公式如图 2 下,使用求导公式对一个 3 行 3 列的二维数组求导,数组的值是 A 到 I,则对应 x 和 y 方向求导,如图 3 所示,其中常数可以忽略,x 方向求导可以看成两个数组相乘,如图 4 所示:

图2: 梯度计算公式

图3: 梯度计算上

图4:梯度计算下

图 4 中的像素值和数字相乘的过程,与卷积操作非常像,数字类比卷积核,此处把这些数字称为模板。接下来,用代码实现 x 方向的图像梯度,先建立一个模板 dx,对应代码中的 kernel 数组,其数值是展示在图 5,再实现模板与图像像素值的相乘的过程,对应代码中的 filter2D 函数,代码实现如下,最后图 6 展示图像梯度的效果,找到了上图 1 中像素值剧烈变化的区域。

图5:模板

图6:梯度效果

通过比较图像在水平和垂直方向像素值差异找到图像的边缘方法称为 Prewitt 算子,水平的算子模板 dx 和垂直的算子模板 dy 如图 7 所示,可以使用 OpenCV 中的 filter2D 函数实现 Prewitt 算子,代码如下,效果如图 8 所示。

图7:Prewitt 算子模板

图8:边缘检测效果

2. 边缘检测(Sobel)

在 Prewitt 算子的基础上提高中心点的权重便是 Sobel 算子,中心点的权重为 2,其模板展示在图 9。

图9:Sobel 算子模板

3. 边缘检测(Laplacian)

通过二阶导数的形式找到图像中的边缘便是 Laplacian 算子,图像的二阶导数展示在图10,其模板展示在图 11,OpenCV 中的 Laplacian 函数实现该算子,代码如下,效果如图 12 所示。

图10:图像二阶导数

图11:Laplacian算子模板

图12:边缘检测效果

3. 边缘检测(Canny)

以上的算子是找到图像中像素值变化巨大的区域,而这个变化巨大的区域不一定是边缘,面对这个不足,John.F.Canny 提出一个 Canny 边缘检测算法,它具有低错误率,检测出的边缘是真正的边缘;良好的定位,检测出的边缘像素点与真正边缘的像素点距离近;对噪声不敏感,噪声不应该标注为边缘。Canny边缘检测算法有四个步骤:

  1. 降低对噪声的影响,对图像做高斯滤波或中值滤波,过滤噪声。

  2. 使用Sobel算子对图像的每个像素点求梯度大小和方向。

  3. 使用非极大值抑制算法在一组边缘中选取最好的边缘,具体做法是检查每个像素点与附近梯度方向一致的像素点,当前像素点梯度最大,则保留,否则去除。

  4. 使用双阈值(小阈值, 大阈值)确定最终的边缘,像素点梯度高于大的阈值,则保留;像素点低于小的阈值,则忽略;介于两个阈值之间,判断像素点与边缘像素点是否相连。

OpenCV 中 cv2.Canny 函数可以进行 Canny 边缘检测,示例代码如下,效果展示在图13。

图13:边缘检测效果

关注+星标【CV算法恩仇录】

相关推荐
AI机器学习算法2 小时前
《动手学深度学习PyTorch版》笔记
人工智能·学习·机器学习
IT大白鼠2 小时前
AIGC性能的关键瓶颈:算力、数据、算法三者如何互相制约?
算法·aigc
白雪茫茫3 小时前
监督学习、半监督学习、无监督学习算法详解
python·学习·算法·ai
FengyunSky3 小时前
浅析 空间频率响应 SFR 计算
算法
树下水月3 小时前
PHP 一种改良版的雪花算法
算法·php·dreamweaver
一只数据集4 小时前
全尺寸人形机器人灵巧手力觉触觉数据集-2908条ROSbag数据覆盖14大应用场景深度解析
大数据·人工智能·算法·机器人
罗西的思考5 小时前
【GUI-Agent】阿里通义MAI-UI 代码阅读(2)--- 实现
人工智能·算法·机器学习
techdashen6 小时前
p99 延迟从 9.5 毫秒降到 18 微秒:Cloudflare 机器学习基础设施重构全记录
人工智能·机器学习·重构
刀法如飞6 小时前
TypeScript 数组去重的 20 种实现方式,哪一种你还不知道?
前端·javascript·算法
sali-tec7 小时前
C# 基于OpenCv的视觉工作流-章66-直线夹角
图像处理·人工智能·opencv·算法·计算机视觉