当前位置: 首页 > 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,即高斯拉普拉斯算子。它结合了拉普拉斯算子(用于边缘增强)和高斯滤波器(用于去噪的特点)

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

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


http://www.mrgr.cn/news/94529.html

相关文章:

  • Python Matplotlib面试题精选及参考答案
  • Python精进系列:隐藏能力之魔术方法
  • 315周六复盘(118)本周回顾
  • 入门基础项目-前端Vue_02
  • UE4-UE5虚幻引擎,前置学习一--Console日志输出经常崩溃,有什么好的解决办法
  • MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.2 MySQL开发环境搭建
  • 链表·简单归并
  • 【技术支持】记一次mac电脑换行符差异问题
  • 精通游戏测试笔记(持续更新)
  • 【云原生技术】容器技术的发展史
  • 高频面试题(含笔试高频算法整理)基本总结回顾48
  • 高频面试题(含笔试高频算法整理)基本总结回顾43
  • 【Linux内核系列】:文件系统收尾以及软硬链接详解
  • AI Agent 时代开幕-Manus AI与OpenAI Agent SDK掀起新风暴
  • sentinel限流算法
  • Python教程(三):类对象、闭包、装饰器、类型注解、MRO
  • C++进阶——map和set的使用
  • 便捷搞定计算机名、IP 与 Mac 地址修改及网卡问题的软件
  • RxSwift 学习笔记第二篇之Observables
  • RxSwift 学习笔记之RxSwift的调试