六 OpenCV圖像處理4 Canny 邊緣檢測
1.Canny 邊緣檢測原理
步驟:
·1噪聲去除: 由於邊緣檢測很容易受到噪聲影響,所以第一步是使用 5x5 的高斯濾波器 去除噪聲
·2計算圖像梯度:
對平滑後的圖像使用 Sobel 算子計算水平方向和豎直方向的一階導數(圖 像梯度)(Gx 和 Gy)
根據得到的這兩幅梯度圖(Gx 和 Gy)找到邊界的梯 度和方向
梯度的方向一般總是與邊界垂直。梯度方向被歸為四類:垂直,水平,和 兩個對角線。
·3
在獲得梯度的方向和大小之後,應該對整幅圖像做一個掃描,去除那些非 邊界上的點。對每一個像素進行檢查,看這個點的梯度是不是周圍具有相同梯 度方向的點中最大的。如下圖所示:
得到的是一個包含“窄邊界”的二值圖像。
·4滯後閥值
現在要確定那些邊界才是真正的邊界。這時我們需要設置兩個閾值: minVal 和 maxVal
當圖像的灰度梯度高於 maxVal 時被認為是真的邊界, 那些低於 minVal 的邊界會被拋棄。如果介於兩者之間的話,就要看這個點是 否與某個被確定為真正的邊界點相連,如果是就認為它也是邊界點,如果不是 就拋棄
A 高於閾值 maxVal 所以是真正的邊界點,C 雖然低於 maxVal 但高於 minVal 並且與 A 相連,所以也被認為是真正的邊界點。而 B 就會被拋棄,因 為他不僅低於 maxVal 而且不與真正的邊界點相連。所以選擇合適的 maxVal 和 minVal 對於能否得到好的結果非常重要
2.OpenCV Canny 函數
OpenCV中的Canny函數
這個函數的第一個參數是輸入圖像。
第二和第三 個分別是 minVal 和 maxVal。
第三個參數設置用來計算圖像梯度的 Sobel 卷積核的大小,默認值為 3。
最後一個參數是 L2gradient,它可以用來設定 求梯度大小的方程。如果設為 True,就會使用我們上面提到過的方程,否則 使用方程:Edge?Gradient(G) = |G2 x | + |G2 y | 代替,默認值為 False。
3.Demo
import cv2 as cv import numpy as np import matplotlib.pyplot as plt
img = cv.imread(‘E:\\fruits_copy.jpg‘) edges = cv.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = ‘gray‘) plt.title(‘Original Image‘)
plt.subplot(122),plt.imshow(edges,cmap = ‘gray‘) plt.title(‘Edge Image‘) plt.show() |
閥值不同,得到的結果差別也很大
六 OpenCV圖像處理4 Canny 邊緣檢測