1. 程式人生 > >OpenCV學習筆記(11)——Canny邊緣檢測

OpenCV學習筆記(11)——Canny邊緣檢測

bubuko nal die pan 一個 變化 我們 大小 ima

  • 了解Canny邊緣檢測的概念

1.原理

  Canny邊緣檢測是一種非常流行的邊緣檢測算法,是 John F。Canny在1986年提出的。它是一個有很多步構成的算法

1)噪聲去除

  使用5*5的高斯濾波器去除噪聲

2)計算圖像梯度

  對平滑後的圖像使用Sobel算子計算水平方向和豎直方向的一階導數。根據得到的這兩幅梯度圖找到邊界的梯度和方向,公式如下: 

技術分享圖片

  梯度的方向一般總是與邊界垂直。梯度的方向被歸為四類:垂直,水平,和兩個對角線

3)非極大值抑制

  在獲得梯度的方向和大小以後,應該對整幅圖像做一個掃描,去掉那些非邊界上的點。對每一個像素進行檢查,看這個點的梯度是不是周圍具有相同梯度方向的點中最大的。這樣可以得到的是一個包含“窄邊界”的二值圖像。

4)滯後閾值

  現在我們需要確定那些邊界次啊是真正的邊界。這時我們需要設置兩個閾值:minVal和maxVal。當圖像的灰度梯度高於maxValし被認為是真的邊界,那些低於minVal的邊界則會被拋棄。若結余兩者之間的話,就要看這個點是否與某個被確定為真正的邊界點相連,如果相連則認為是邊界點,否則就拋棄掉。例子如下:

  技術分享圖片

  A段被視為真正的邊界點,C段雖低於最大閾值,但是與A段相連,因此也視為邊界點,而B段則被拋棄,因為不與真正的邊界點相連。在這一步小的噪聲點也會被除去,因為我們假設邊界都是一些長的線段。

 

2.OpenCV中Canny邊界檢測

  在OpenCV中只需要一個函數cv2.Canny()就可以實現上面的步驟。該函數的第一個參數是輸入圖像。第二和第三個參數分別是minVal 和 maxVal 。第四個參數設置用來計算圖像梯度的Sobel卷積核大小,默認為3.最後一個參數為L2gradient,他可以用來設定求梯度大小的方程。如果設定為True,就會使用我們上面提到的方程。否則會使用技術分享圖片

。該參數默認為False

例程如下:

# -*- coding:utf-8 -*-

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread(‘4.jpg‘,0)
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()

  

效果如下

技術分享圖片

通過修改閾值可以看到輪廓的變化

OpenCV學習筆記(11)——Canny邊緣檢測