图像处理之边缘检测

Canny边缘检测算法一直是边缘检测的经典算法,出自论文:《A Computational Approach to Edge Detection》

Canny边缘检测算法的处理流程:

  1. 使用高斯滤波器,以平滑图像,滤除噪声。
  2. 计算图像中每个像素点的梯度强度和方向。
  3. 应用非极大值抑制,以消除边缘检测带来的杂散响应。
  4. 应用双阈值检测来确定真实的和潜在的边缘。
  5. 通过抑制孤立的弱边缘最终完成边缘检测。

1.高斯滤波去燥

任何边缘检测算法都不可能在未经处理的原始数据上很好地处理,所以第一步是对原始数据与高斯核作卷积,得到轻微模糊的去燥图像。

2. Sobel算子计算像素梯度

Sobel算子是两个3*3的矩阵,分别为Sx和Sy。前者用于计算图像x方向像素梯度矩阵Gx,后者用于计算图像y方向像素梯度矩阵Gy。假设x和y方向的Sobel算子分别为:

Gx和Gy的值为(其中*为卷积符号,sum表示矩阵中所有元素相加求和):

根据公式可以确定像素点的梯度G和方向theta:

(其中G为梯度强度, theta表示梯度方向,arctan为反正切函数)

3. 非极大值抑制

非极大值抑制则可以帮助将局部最大值之外的所有梯度值抑制为0。

1) 将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较。

2) 如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制。

在跨越梯度方向的两个相邻像素之间使用最近邻插值来得到要比较的像素梯度,现举例如下:

 将梯度分为8个方向,分别为E、NE、N、NW、W、SW、S、SE,其中0代表0度~45度,1代表45度~90度,2代表-90度~-45度,3代表-45度~0度。像素点P的梯度方向为θ,则像素点P1和P2的梯度线性插值为:

因此非极大值抑制的过程就是用Gp 与Gp1 和Gp2 进行比较,如果Gp 最大则保留,否值删除。

4. 双阈值法筛选边缘点

非极大值抑制之后,剩余的像素可能并不能准确表示图像实际边缘,由于噪声和颜色变化引起的一些边缘像素会干扰边缘检测的有效检测。为了解决这些杂散响应,可以通过选择高低阈值来解决。如果边缘像素的梯度值高于高阈值,则将其标记为强边缘像素;如果边缘像素的梯度值小于高阈值但大于低阈值,则将其标记为弱边缘像素;如果边缘像素的梯度值小于低阈值,则会被抑制。阈值的选择取决于给定输入图像的内容。

5.抑制孤立低阈值点

针对若边缘点,通过查看弱边缘像素及其8个邻域像素来判断是否保留该像素。只要其中一个为强边缘像素,则该弱边缘点就可以保留为真实的边缘。

举个例子:

Code:

img = cv2.GaussianBlur(img, (3, 3))

canny = cv2.Canny(img, 50, 200)

高斯滤波后进行canny边缘检测,其中低阈值为50高阈值为200。下方左图为原始图像右图为canny边缘检测后的图像。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章