计算机视觉_OpenCV开源库讲解(边缘提取)

	在图形图像中,梯度和边缘是非常相似的性质,在处理图像中,常常提取图像的边缘加以运算,下面介绍一个常用的边缘提取算子:Canny算子
Canny的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:
好的检测- 算法能够尽可能多地标识出图像中的实际边缘。
好的定位- 标识出的边缘要与实际图像中的实际边缘尽可能接近。
最小响应- 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。
为了满足这些要求Canny使用了变分法,这是一种寻找满足特定功能的函数的方法。最优检测使用四个指	数函数项的和表示,但是它非常近似于高斯函数的一阶导数。

算法步骤

	一:降噪:用高斯滤波器平滑图像.
	二:寻找梯度:用一阶偏导有限差分计算梯度幅值和方向.
	三:跟踪边缘:对梯度幅值进行非极大值抑制;用双阈值算法检测和连接边缘.

第一步:灰度化;
把彩色图像变成灰度图像,该部分是按照Canny算法通常处理的图像为灰度图,如果获取的彩色图像,那首先就得进行灰度化。

第二步:高斯滤波
对图像高斯滤波,图像高斯滤波的实现可以用两个一维高斯核分别两次加权实现,也就是先一维X方向卷积,得到的结果再一维Y方向卷积。当然也可以直接通过一个二维高斯核一次卷积实现。也就是二维卷积模板,由于水平有限,只说二维卷积模板怎么算。

   首先,一维高斯函数:

在这里插入图片描述

      二维高斯函数:

在这里插入图片描述

     模板中每一个点的高斯系数可以由上面的公式计算,这样得到的是不是最终的模板呢?答案不是,需要归一化,也即是每一个点的系数要除以所有系数之和,这样才是最终的二维高斯模板。

第三步:计算梯度值和方向
图像的边缘可以指向不同方向,因此经典Canny算法用了四个梯度算子来分别计算水平,垂直和对角线方向的梯度。但是通常都不用四个梯度算子来分别计算四个方向。常用的边缘差分算子(如Rober,Prewitt,Sobel)计算水平和垂直方向的差分Gx和Gy。这样就可以如下计算梯度模和方向:
在这里插入图片描述
梯度角度θ范围从弧度-π到π,然后把它近似到四个方向,分别代表水平,垂直和两个对角线方向(0°,45°,90°,135°)。可以以±iπ/8(i=1,3,5,7)分割,落在每个区域的梯度角给一个特定值,代表四个方向之一。

这里选择Sobel算子计算梯度,相对于其他边缘算子,Sobel算子得出来的边缘粗大明亮。
在这里插入图片描述
第四步:非极大值抑制
非极大值抑制是进行边缘检测的一个重要步骤,通俗意义上是指寻找像素点局部最大值。沿着梯度方向,比较它前面和后面的梯度值进行了,若不是最大值,则舍去。

第五步:双阈值的选取
一般的边缘检测算法用一个阈值来滤除噪声或颜色变化引起的小的梯度值,而保留大的梯度值。Canny算法应用双阈值,即一个高阈值和一个低阈值来区分边缘像素。如果边缘像素点梯度值大于高阈值,则被认为是强边缘点。如果边缘梯度值小于高阈值,大于低阈值,则标记为弱边缘点。小于低阈值的点则被抑制掉。

第六步:滞后边界跟踪
强边缘点可以认为是真的边缘。弱边缘点则可能是真的边缘,也可能是噪声或颜色变化引起的。为得到精确的结果,后者引起的弱边缘点应该去掉。通常认为真实边缘引起的弱边缘点和强边缘点是连通的,而又噪声引起的弱边缘点则不会。所谓的滞后边界跟踪算法检查一个弱边缘点的8连通领域像素,只要有强边缘点存在,那么这个弱边缘点被认为是真是边缘保留下来。

Canny参数详解:
1,image单通道输入图像.
2,edges单通道存储边缘的输出图像
3,threshold1第一个阈值
4,threshold2第二个阈值
5,aperture_sizeSobel 算子内核大小
6,为计算ROI区域,本参数为默认参数,默认为false;

上代码:

发布了18 篇原创文章 · 获赞 12 · 访问量 417

猜你喜欢

转载自blog.csdn.net/qq_41408585/article/details/104074023