图像分割 - Canny边缘检测

目录

1. 介绍

2. Code


1. 介绍

Canny 边缘检测基于以下三个目标:

  • 低错误率。所有边缘都应该被找到,不应该有虚假响应
  • 边缘点应该更好的被定位。检测到的边缘和真实边缘之间的距离应该最小
  • 单个边缘点响应。对于真实的边缘点,检测子应该只返回一个点,

Canny边缘检测算法的步骤:

Canny 是基于一阶微分的

  1.  首先用高斯滤波平滑图像。
  2.  计算梯度幅值图像和方向角度图像
  3. 对梯度图像应用非极大值抑制
  4. 使用双阈值处理和连通性分析来检测连接边缘

首先,检测边缘前要平滑图像减少噪声的影响。这里采样的是高斯滤波器,高斯核的大小 >= 滤波器标准差的6倍取最小的奇整数

其次,需要用一阶导数计算幅值图像和角度图像。Canny检测是基于一阶导数的,所以这里使用的是一阶差分算子。

图像分割 - Canny边缘检测_第1张图片

然后,对梯度图像进行非极大值抑制NMS(Non - Maxima Suppression)。根据第二步求出的角度图像,用该像素点 比较 在梯度方向和其反方向的像素点。如果该像素点的梯度幅值最大则保留;否则,删去。

图像分割 - Canny边缘检测_第2张图片

 最后,进行双阈值处理。用来确定真正的边缘和删去伪边缘

根据设置的两个阈值(T_{L} 为低阈值 T_{H} 为高阈值),就会将幅值图像划为三部分,进行如下的分割

  • 像素点的响应强度是 > T_{H} 的,那么认为是真正的边缘
  • 像素点的响应强度是 < T_{L}  的,那么认为是伪边缘,删去
  • 如果介于两者之间,则检查周围的8领域,如果存在真正的边缘就保留,为了连接边缘。否则就删去

 

2. Code

opencv 里面Canny 的语法格式为:

图像分割 - Canny边缘检测_第3张图片 

注:

  • 彩色图像也可以
  • 高低阈值比例最后控制在2:1到3:1之间
  • L2gradient 为计算幅值图像的方式,默认为近似计算(绝对值代替平方和),设置为True的时候,采样精确的计算

 

代码演示:

import numpy as np
import cv2

img = cv2.imread('./flower.jpg',0)

dst = cv2.Canny(img,100,200)    # Canny 边缘检测

cv2.imshow("img",np.hstack((img,dst)))
cv2.waitKey()
cv2.destroyAllWindows()

处理结果为:

图像分割 - Canny边缘检测_第4张图片

 

你可能感兴趣的:(数字图像处理,算法,图像处理,python)