目录
demo
原理
噪声去除
计算图像梯度
非极大值抑制
滞后阈值
demo
cv2.Canny()函数:用于边缘检测。
第一个参数表示输入图像。
第二个参数表示滞后过程中的第一个阈值,计算出的边界点大于这个阈值才是真正边界
第三个参数表示滞后过程中的第二个阈值,计算出的边界点低于这个阈值被抛弃
具体滞后过程中的两个阈值见原理部分说明。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('../data/image/2.jpeg')
#边缘检测
edges = cv2.Canny(img,100,200)
#显示原图
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
#显示边缘检测后的图
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()
原理
Canny边缘检测是有John F.Canny在1986年提出的,它有噪声去除、计算图像梯度、非极大值抑制和滞后阈值组成。
噪声去除
由于边缘检测很容易受到噪声影响,所以第一步是使用5*5的高斯低通滤波器去除噪声
计算图像梯度
对平滑后的图像使用Sobel算子计算水平方向和竖直方向的一阶导数(图像梯度)(Gx和Gy),根据这两幅梯度图(Gx和Gy)找到边界的梯度和方向,公式如下:
梯度的方向一般总是与边界垂直。梯度方向被归为四类:垂直,水平和两个对角线。
非极大值抑制
在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点。对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的。
滞后阈值
现在要确定哪些边界才是真正的边界,这时我们需要设置两个阈值:minVal和maxVal。当图像的灰度梯度高于maxVal被认为是真正的边界,那么低于minVal的边界会被抛弃。如果介于两者直接,就要看这个点是否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是就抛弃。
A高于阈值maxVal所以是真正的边界,C虽然低于maxVal但高于minVal并且与A相连,所以也被认为是真正的边界点。而B就会被抛弃,因为他不仅低于maxVal而且不与真正的边界点相连。