OpenCV图像处理_边缘检测

1. 边缘检测

1.1 主要思想:标识数字图像中亮度变化明显的点;大幅度减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。

1.2 边缘检测分类

(1)基于搜索:通过寻找图像一阶导数中的最大值来检测边界,然后利用计算结果估计边缘的局部方向,通常采用梯度的方向,并利用此方向找到局部梯度模的最大值,代表算法是Sobel算子和Scharr算子

(2)基于零穿越:通过寻找图像的二阶导数零穿越来寻找边界,代表算法是Laplacian算子

2 .Sobel算子:基于搜索的方法获取边界

2.1 主要用途:用于对效率要求高,对细纹理不太关心的时候

2.2 方法

假设要处理的图像为I,在两个方向进行求导:

(1)水平变化:将图像I与奇数大小的模板进行卷积,结果为Gx,当模板大小为3时,Gx为:

图像边缘检测 python 对图像进行边缘检测_边缘检测


(1)垂直变化:将图像I与奇数大小的模板进行卷积,结果为Gy,当模板大小为3时,Gy为:

图像边缘检测 python 对图像进行边缘检测_图像边缘检测 python_02


注意:当内核大小为3时,以上Sobel内核可能会产生比较明显的误差,为解决这一问题,可以使用Scharr算子,但此函数仅作用于大小为3的内核

图像边缘检测 python 对图像进行边缘检测_python_03


语法

Sobel_x_or_y=cv.Sobel(src,ddepth,dx,dy,dst,ksize,scale,delta,borderType)

参数

(1)src:传入的图像

(2)ddepth:图像的深度(cv.CV_16S)

(3)dx,dy:求导的阶数,取值为0(没有求导),1(1阶导)

(4)ksize:卷积核大小,必须为奇数,默认为3

(5)scale:缩放导数的比例常数,默认情况下无伸缩系数

(6)borderType:图像边界的模式

注意

(1)格式转换函数:Scale_abs=cv.convertScaleAbs(x)

(2)图像混合:result=cv.addWeighted(src1,alpha,src2,beta)

Sobel算子:

图像边缘检测 python 对图像进行边缘检测_图像边缘检测 python_04


Scharr算子: (ksize:卷积核大小,为-1)

图像边缘检测 python 对图像进行边缘检测_边缘检测_05


3. Laplacian算子:基于零穿越获取边界

主要思想:利用二阶导数来进行边缘检测

卷积核为:

图像边缘检测 python 对图像进行边缘检测_边缘检测_06


语法:laplacinotallow=cv.Laplacian(src,ddepth[,ksize[,scale[,delta[,borderType]]]])

参数

(1)src:需要处理的图像

(2)ddepth:图像的深度(cv.CV_16S)

(4)ksize:卷积核大小,必须为奇数,默认为3

图像边缘检测 python 对图像进行边缘检测_python_07

4.Canny边缘检测算法

步骤

(1)噪声去除:高斯滤波

(2)计算图像梯度:sobel算子,计算梯度大小和方向

(3)非极大值抑制:利用梯度方向像素来判断当前像素是否为边界点

(4)滞后阈值:设置两个阈值,确定最终的边界

语法:canny=cv.Canny(image,threshold1,threshold2)

参数

(1)image:灰度图

(2)threshold1:较小的阈值将间断的边缘连接起来

(3)threshold2:较大的阈值检测图像中明显的边缘

图像边缘检测 python 对图像进行边缘检测_python_08