Canny邊緣檢測:cv2.Canny()
1.原理
1.1噪音去除
由于邊緣檢測很容易受到噪音影響,所以第一步是使用5x5的高斯濾波器去除噪音。
1.2計算圖像梯度
對平滑后的圖像使用Sobel算子計算水平方向和豎直方向的一階導數(圖像梯度)(Gx和Gy)。根據得到的這兩幅梯度圖找到邊界的梯度和方向。公式如下:

梯度的方向一般總是與邊界垂直。梯度方向被歸為四類:垂直,水平,和兩條對角線。
1.3非極大值抑制
在獲得梯度的方向和大小之后,應該對整幅圖想做一個掃描,出去那些非邊界上的點。對每一個像素進行檢查,看這個點的梯度是不是周圍具有相同梯度方向的點中最大的。

現在你得到的是一個包含“窄邊界”的二值圖像。
1.4滯后閥值
現在要確定那些邊界才是真正的邊界,需要設置兩個閥值:minVal和maxVal。當圖像的灰度梯度高于maxVal時被認為是真的邊界,那些低于minVal的邊界會被拋棄。如果介于兩者之間的話,就要看這個點是否與某個被確定為真正邊界點相連,如果是,就認為它也是邊界點,如果不是就拋棄。
2.OpenCV中的Canny邊界檢測
cv2.Canny()第一個參數是輸入圖像,第二和第三個分別是minVal和maxVal。第三個參數設置用來計算圖像梯度的Sobel卷積核的大小,默認值為3。最后一個參數是L2gradient,它可以用來設定求梯度大小的方程。如果設為True,就睡使用我們上面提到過的方程,否則使用方程:代替,默認值為False。
~~~
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('1024.jpg',0)
edges = cv2.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap='gray')
plt.title('original'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap='gray')
plt.title('edge'),plt.xticks([]),plt.yticks([])
plt.show()
~~~
