| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> opencv-python 详解边缘检测 -> 正文阅读 |
|
[人工智能]opencv-python 详解边缘检测 |
目录 先谈一下边缘检测算法sobel? ? ? ? 关于上图图像的边缘,图像中像素灰度值变化没有规律。一种比较好的描述这种变化的方法是采用导数。其中梯度剧烈变化的地方代表图像灰度值变化强烈的地方,也就是边缘。 ?如果对上面的1维图像求导数,得到下图,可以很明显的看到边缘所在的位置。 ????????从上面的解释,我们可以设置一个阈值,根据局部像素变化强烈程度获取图像边缘。 ?b.垂直方向: ?具体运算为: 结合上面结果可以计算出图像中一个点的近似梯度: ? ?或者表示为: Scharr算子Scharr()?函数提供了比标准Sobel函数更精确的计算结果。它使用了下面的核: ?除了卷积核与Sobel不同,在其余方面它与Sobel基本一致。 ?Laplacian()拉普拉斯算子Sobel边缘检测原理是利用边缘区域像素值的跳变。通过求一阶导数,可以使边缘值最大化。如下图所示: 那么,如果求二阶导数会得到什么呢? ? ????????可以观察到边缘处于二阶导数为0的地方。因此,可以利用该方法获取图像中的边缘。然而,需要注意的是二级导数为0的不只出现在边缘地方,还可能是一些无意义的位置,根据需要通过滤波处理该情况。 ????????现在我们来讨论二阶微分,它是拉普拉斯算子的基础,与微积分中定义的微分略有不同,数字图像中处理的是离散的值,因此对于一维函数的一阶微分的基本定义是差值: ?类似的,二阶微分定义为: ?将一维函数扩展到二维: 二阶微分的定义保证了以下几点: 1、在恒定灰度区域的微分值为0 2、在灰度台阶或斜坡的起点处微分值非零 可以看出,二阶微分可以检测出图像的边缘、增强细节 由于图像是二维的,因此需要分别获取两个方向的导数,拉普拉斯算子用下面公式定义: ?其中: ?可以用多种方式将其表示为数字形式。对于一个3*3的区域,一般情况下被推荐最多的形式是: ?实现上式的滤波器模板为: ?我们发现,拉普拉斯算子不需要像Sobel算子那样分别对x,y方向进行处理,它可以直接处理 . 较为复杂的图像拉普拉斯算子的效果也并不是很好,由于二阶微分一定的局限性,目前的边缘检测还不够完美,我们需要一种综合的算法,类似 canny() 边缘检测算法通常有四个步骤:(1)滤波:边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能.需要指出,大多数滤波器在降低噪声的同时也导致了边缘强度的损失,因此,增强边缘和降低噪声之间需要折衷. canny() 边缘检测:????????JohnCanny于1986年提出Canny算子,它与Marr(LoG)边缘检测方法类似,也属于是先平滑后求导数的方法,看下原理: 1、灰度化图像 Canny算法通常处理的图像为灰度图,因此如果摄像机获取的是彩色图像,那首先就得进行灰度化。对一幅彩色图进行灰度化,就是根据图像各个通道的采样值进行加权平均。以RGB格式的彩图为例,通常灰度化采用的方法主要有: 方法1:Gray=(R+G+B)/3 方法2:Gray=0.299R+0.587G+0.114B;(这种参数考虑到了人眼的生理特点) 注意1:至于其他格式的彩色图像,可以根据相应的转换关系转为RGB然后再进行灰度化; 注意2:在编程时要注意图像格式中RGB的顺序通常为BGR。 2、高斯滤波消除噪声 令f(x,y)表示数据(输入源数据),G(x,y)表示二维高斯函数(卷积操作数),fs(x,y)为卷积平滑后的图像。 Guess过程: 用坐标点(x,y)表示一个3x3的邻域,设中心点的坐标为(0,0),相邻的点以此类推。 ?计算权重矩阵。设定方差σ2=0.64的值,将对应各个坐标点(x,y)带入二维高斯公式G(x,y)中,得到一个权重矩阵,归一化权重矩阵(矩阵中各个点除以权重之和),得到标准的权重矩阵,即高斯模板。 计算高斯模糊。设在一幅图像中的3×3区域内,用各像素点的灰度值乘以对应点的权重。 ?将得到的9个值求和,就是中心点的高斯模糊值。 简单来说就是使用Guess模板在原始图像中进行移位、相乘、相加的过程。 3、计算幅值图像、角度图像,计算图像梯度的方向 求变化率时,对于一元函数,即求导;对于二元函数,求偏导。数字图像处理中,用一阶有限差分近似求取灰度值的梯度值(变化率)。 例:计算一点x方向和y方向的梯度幅值和方向? ????????上图中显示一段直的边缘线段放大后一部分,每个方块代表一个像素点,用一个方框强调点处边缘的幅值和方向。令灰色像素值为0,白色像素值为1。 如图关于一点为中心的?3×3邻域,使用Prewittt卷积模板进行计算: ????????根据x方向和y方向的卷积模板,可知,在3x3的邻域中从底部一行像素值减去顶部一行的像素,得到x方向的偏导数(梯度);同样,从右边一列像素值减去左边一列的像素,得到y方向的偏导数。 x方向的梯度: ?y方向的梯度: ?由此,可以得到该点梯度的幅值和方向: ?如下图表示了中心点的梯度向量、方位角以及边缘方向。(任一点的边缘与梯度向量正交): ?Canny算子的卷积模板为: 4、对幅值图像进行非极大值抑制 首先将角度划分成四个方向范围:水平(0°)、?45°、垂直(90°)、+45°如下图: ?接着讨论对3x3区域的四个基本边缘方向进行非极大值抑制。 ?做法:若中心点(即:访问点)在沿其方向上邻域的梯度幅值最大,则保留;否则,抑制。 5、双阈值检测和连接边缘,滞后阈值 ????????经过前面四步,就只剩下0和可能的边缘梯度值了,为了最终确定下来,需要设定高低阈值:
?推荐的高低阈值TH和TL比在2:1到3:1之间。 ????????取出非极大值抑制后的图像中的最大梯度幅值,定义高低阈值。即:TH×Max,TL×Max (当然可以自己给定)?; ????????将小于低阈值的点抛弃,赋0;将大于高阈值的点立即标记(这些点就是边缘点),赋1; ????????将小于高阈值,大于低阈值的点使用8连通区域确定(即:只有与TH像素连接时才会被接受,成为边缘点,赋??1)。 canny()测试,测试图片:测试代码:
效果: ?关于边缘检测函数 cv2.Canny() edge = CV2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])? 参数2、3表示最低、高阈值,参数3用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的第一个阈值用于将这些间断的边缘连接起来。 ????????可选参数中apertureSize就是Sobel算子的大小。而L2gradient参数是一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),否则使用L1范数(直接将两个方向导数的绝对值相加)。? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/1 10:20:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |