基于Python的Opencv学习第十一天
今天为大家先介绍一下laplacian算子,来结束图像梯度的内容,然后介绍一下canny边缘检测。
一.laplacian算子
laplacian算子类似于二阶的sobel导数,因为laplacian算子的卷积核不同,其卷积核如图:
可以看到卷积核里面的系数同sobel算子和scharr算子不同。其中,laplacian算子的计算公式为:
P5=(p2+p4+p6+p8)-4*p5
来看示例:
来对比一下三种算子:
这里可以看到完全是因为三类算子其系数不同而导致结果不同。
在opencv里面,利用
cv2.Laplacian(src,ddepth)
在这里,dst为结果图像,src为原图像,ddepth为图像深度。
通常计算时,图像深度使用更高的数据类型cv2.CV_64F,取绝对值后,再转为np.uint8(cv2.CV_8U)类型。
import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\lena.jpg")
laplacian=cv2.Laplacian(a,cv2.CV_64F)
laplacian=cv2.convertScaleAbs(laplacian)
cv2.imshow("a",a)
cv2.imshow("laplacian",laplacian)
可以看到代码和结果。
二.Canny边缘检测
1.Canny边缘检测原理
Canny边缘检测的一般步骤分四步:
①去噪
边缘检测容易受到噪声的影响,所以在进行边缘检测前要进行去噪处理,通常采用高斯滤波器去除噪声
至于高斯滤波器的方法和使用,需要参考我以前的博客
即是让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值(除以56的原因是加起来的值等于56,然后可以确保得到的值能够在0~256之间)
②梯度
对平滑后的图像采用sobel算子计算梯度和方向
梯度的计算前面博客介绍了,至于方向,首先计算水平方向的梯度和竖直方向上的梯度,然后通过算式:
Angle(α)=tan^-1(Gy/Gx)可以得到该点的方向
梯度的方向一般总是与边界垂直,有四类:垂直,水平,以及两个对角线方向。
③非极大值抑制
在获取梯度和方向后,遍历图像,去除所有不是边界的点。实现方法:逐个遍历像素点,判断当前像素点是否是周围像素中具有相同方向梯度的最大值
如图,点A,点B,点C三点具有相同的方向,梯度方向垂直于边缘,判断点A是否为点A,点B,点C的局部最大值:如果是,保留该点;否则,该点被抑制(即像素值归零)。
来看个例子:
黄色背景的值被保留,其余点被抑制(处理为0)
④滞后阈值
这里我们选取两个阈值,分别为最大阈值和最小阈值
看上图右侧,比边界阈值大的保留,与边界相连保留,其他的则抛弃。所以最后的结果为:
这里B和D被剔除,值被处理为0。
来看一下边缘处理的美:
2.Canny边缘检测函数
边缘检测的函数为cv2.Canny(),具体格式为:
edges=cv2.Canny(image,threshold1,threshold2)
参数说明:
edges为边界图像
image为原图像
threshold1为上面提到的阈值minVal
threshold2为上面提到的阈值maxVal
调整阈值,可以控制边缘细节:
maxVal,minVal变小,有更多的细节信息。
import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\lena.jpg")
r1=cv2.Canny(a,100,200)
r2=cv2.Canny(a,64,128)
cv2.imshow("a",a)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)
好的,今天的内容就结束了,为大家重点介绍了canny边缘检测知识,大家好好理解一下吧(转载注明出处)