Canny边缘检测流程:
去噪 --> 梯度 --> 非极大值抑制 --> 滞后阈值
- 去噪
- 边缘检测容易受到噪声的影响。因此,在进行边缘检测前,通常需要先进行去噪
- 通常采用高斯滤波器去除噪声
- 让临近的像素具有更高的重要性。对周围像素计算加权平均值,较近的像素具有较大的权重值。
- 梯度/角度
- 对平滑后的图像采用sobel算子计算梯度和方向
- 梯度 E d g e G r a d i e n t ( G ) = G x 2 + G y 2 Edge_{Gradient(G)}=\sqrt{G_x^2+G_y^2} EdgeGradient(G)=Gx2+Gy2
- 角度 A n g l e ( θ ) = t a n − 1 ( G x G y ) Angle(\theta)=tan^{-1}(\frac{G_x}{G_y}) Angle(θ)=tan−1(GyGx)
- 梯度的方向一般总与边界垂直
- 梯度方向被归为四类:垂直,水平,和两个对角线
- 非极大值抑制
- 在获取了梯度和方向后,遍历图像,去除所有不是边界的点
- 实现方法: 逐个遍历像素点,判断当前像素点是否是周围像素点中具有相同方向梯度的最大值
- 滞后阈值
{ 梯 度 值 > m a x V a l 边 界 m a x V a l > 梯 度 值 > m i n V a l 与 边 界 相 连 , 保 留 。 否 则 抛 弃 梯 度 值 < m i n V a l 抛 弃 \begin{cases} 梯度值>maxVal &边界\\ maxVal>梯度值>minVal &与边界相连,保留。否则抛弃\\ 梯度值<minVal &抛弃 \end{cases} ⎩⎪⎨⎪⎧梯度值>maxValmaxVal>梯度值>minVal梯度值<minVal边界与边界相连,保留。否则抛弃抛弃
Canny函数及使用
- 函数Canny
edges = cv2.Canny(image, threshold1, threashold2)
- 参数
- image : 原始图像
- threshold1 : 阈值1 (minVal)
- threshold2 : 阈值2 (maxVal)
- 返回值
Canny实例
import cv2
o = cv2.imread("/home/forrest/图片/lena彩图.jpg", cv2.IMREAD_GRAYSCALE)
cv2.imshow("lena", o)
r1 = cv2.Canny(o, 100, 200)
cv2.imshow("result1", r1)
r2 = cv2.Canny(o, 64, 128)
cv2.imshow("result2", r2)
cv2.waitKey()
cv2.destroyAllWindows()