当前位置: 首页 > news >正文

计算机视觉cv2入门之边缘检测

检测原理

        边缘检测是指检测图像中的一些像素点,它们周围的像素点的灰度发生了急剧的变化,因此可以将这些像素点作为一个集合,用于标注图像中不同物体的边界。

     边缘是图像上灰度级变化很快的点的集合。这些点的梯度往往很大。因此我们可以使用一阶导数和二阶偏导数来进行求解,但图像是离散的数据并以矩阵的形式存储,并不能像数学理论中对直线或曲线一样求导,所以我们使用差分来近似微分,采用不同的差分模板来对原图像进行卷积运算进而实现对图像求导。

导数算子卷积模板推导

  这里,我们以一阶导数算子Prewitt和二阶导数算子Laplacian的卷积模板为例,进一步推导说明其由来。

我们知道,一个函数的一阶与二阶导数可以表示为:

f'(x)=\lim_{\Delta x\to0}\frac{f(x+\Delta x)-f(x)}{\Delta x}

f'(x)=\lim_{\Delta x\to0}\frac{f(x)-f(x-\Delta x)}{\Delta x}

f''(x)=\lim_{\Delta x\to0}\frac{f'(x+\Delta x)-f'(x)}{\Delta x}

f''(x)=\lim_{\Delta x\to0}\frac{f'(x)-f'(x-\Delta x)}{\Delta x}

那么对于离散的函数,其一阶差分为:

f(x+1)-f(x)  ……(1)

f(x)-f(x-1)  ……(2)

(1)式-(2)式我们可以得到其二阶差分为:

f(x-1)-2f(x)+f(x+1)……(3)

(1)式+(2)式可以得到:

f(x+1)-f(x-1) ……(4)

        这里要注意的是,(4)式并不是标准意义上的一阶差分,不过,其可看做是一种"中心差分"的形式,这里我们也近似把它看做一阶差分。实际上这种中心差分的形式主要是为了和我们图像中最常用的3x3卷积模板相配合使用。

我们知道,对于平面图像来说,其有两个方向,并且图像坐标系的原点位于左上角 。

图像坐标系  

Prewitt算子

        prewitt模板分为x与y两个方向。

Prewitt算子在x,y方向上的卷积模板 

这里我们设模板中心点的坐标为(x,y) ,那么其在x方向上的一阶差分利用(4)式可以近似表示为:

提取系数1,0,-1并应用到3x3模板中的每一行便得到了Prewiitt算子在x方向上的卷积模板。

同理,将x变换为y后应用到3x3模板中的每一列便得到了Prewitt算子在y方向上的卷积模板。

Laplacian算子

Laplacian算子模版同时考虑x与y两个方向

      图(a)                        Laplacian算子卷积模板                      图(b)

         因此其在差分时是二元差分,我们设3x3卷积模板中心坐标为(x,y),那么在4邻域范围内,即(x-1,y),(x,y),(x+1,y),(x,y-1),(x,y+1),其二阶差分结果为:

         提取系数并填入3x3卷积模板中便得到了图(a)所示的Laplacian卷积模板,同时考虑到对角线上的元素,我们也进行二阶差分,然后便得到了如图(b)更通用的Laplacian算子。

        Laplacian卷积模板有个特点是中心处为负,周边为正,且模板内所有元素之和为0。

 常见算子

一阶导数算子

Roberts(重点关注斜对角线)

Prewitt 

Sobel(Prewitt基础上给予中心位置更大权重) 

对于一阶导数算子而言,我们最后还需要使用不同的范数来计算其在x,y方向上梯度矢量的幅度。

一般而言,我们可以使用L2范数,此时幅度值为: 

Magnitude=\sqrt{G_{x}^2+G_{y}^2}  

Canny算子 

Canny算子的计算步骤如下:

  1. 用高斯滤波器平滑图像,去除噪声。
  2. 用一阶差分偏导计算梯度方向和幅度(Sobel算子)。
  3. 对梯度值不是极大值的地方进行抑制,将不是机制的点全部置0,去掉大部分的边缘,所以图像边缘会变细。

 

二阶导数算子

Laplacian 

Mar算子   

        Marr算子通常由两部分组成:一个高斯滤波器用于平滑图像,减少噪声的影响;一个差分算子用于检测亮度变化。在每个像素点上进行如下计算:

  1. 用一个2D的高斯平滑模板与原图像卷积。
  2. 计算卷积后图像的拉普拉斯值。
  3. 检测图像中的过零点,将其作为边缘点。

LOG算子 

        LOG算子的全称是Laplacian of Gaussian,即高斯拉普拉斯算子。它结合了拉普拉斯算子(用于边缘增强)和高斯滤波器(用于去噪的特点)

常用边缘检测算子检测特点比较

 简而言之,我们这里介绍的边缘检测算子都是基于梯度,因此其内部的数字都基于差分结果的系数。不同的区别在于,他们中有些使用的差分阶数不同,有些考虑到了使用滤波模版,有些考虑到了中心像素点的权重,有些重点关注斜对角线上像素点的差分结果……但是追根溯源,都不外乎是在利用卷积运算查找灰度值变化明显的地方,这也是边缘的概念所在。

相关文章:

  • 探索ima.copilot:个人知识库搭建的AI新利器
  • WSL2 Ubuntu安装GCC不同版本
  • 解锁C++:指针与数组、字符串的深度探秘
  • 【FC改版激龟快打】MUGEN 激龟快打-含下载地址、出招技能表
  • WSL2 Ubuntu安装Cuda 11.8
  • 蓝桥杯省赛真题C++B组-小球反弹
  • 利用Python爬虫根据关键词获取商品列表
  • 矫平机:工业制造的“误差归零者”,如何重塑智造新生态?
  • 深入理解 Qt 系统托盘图标:创建自定义的系统托盘图标类
  • 星越L_外后视镜使用讲解
  • Python的那些事第四十五篇:继承自Nose的测试框架Nose2
  • python中的max(),需要注意的点
  • 内存泄漏的防范:检测与预防
  • nodejs42 (UI相关) : svg的viewBox属性
  • 【小沐学Web3D】three.js 加载三维模型(React)
  • 【GNU Radio】ZMQ模块学习
  • 弹球小游戏-简单开发版
  • Spring Cloud 中的服务注册与发现: Eureka详解
  • python相关语法的学习文档1
  • @restcontroller和@RequestMapping 注解的简单学习
  • 马上评|持续对标国际一流,才有22项“全球最优”
  • 从黄土高原到黄浦江畔,澄城樱桃品牌推介会明日在上海举办
  • 何立峰将访问瑞士、法国并举行中美经贸高层会谈、第十次中法高级别经济财金对话
  • 巴基斯坦:印度向巴3处地点发射导弹
  • 默茨在德国联邦议院第一轮投票中未能当选总理
  • 莫斯科一机场实施临时限制措施