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


  • 了解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()
  

效果如下

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM