opencv 中的 canny 邊緣檢測
• 了解 canny 邊緣檢測的概念
• 學習函式 cv2.canny()
1、 原理
canny 邊緣檢測是一種非常流行的邊緣檢測演算法,是 john f.canny 在1986 年提出的。它是乙個有很多步構成的演算法,我們接下來會逐步介紹。
1.1 雜訊去除
由於邊緣檢測很容易受到雜訊影響,所以第一步是使用 5x5 的高斯濾波器去除雜訊,這個前面我們已經學過了。
1.2 計算影象梯度
對平滑後的影象使用 sobel 運算元計算水平方向和豎直方向的一階導數(影象梯度)(gx 和 gy)。根據得到的這兩幅梯度圖(gx 和 gy)找到邊界的梯度和方向,公式如下:
梯度的方向一般總是與邊界垂直。梯度方向被歸為四類:垂直,水平,和兩個對角線。
1.3 非極大值抑制
在獲得梯度的方向和大小之後,應該對整幅影象做乙個掃瞄,去除那些非邊界上的點,對每乙個畫素進行檢查,看這個點的梯度是不是周圍具有相同梯度方向的點中最大的。如下圖所示:
現在你得到的是乙個包含「窄邊界」的二值影象。
1.4 滯後閾值
現在要確定哪些邊界才是真正的邊界,需要設定兩個閾值:minval 和 maxval,當影象的灰度梯度高於 maxval 時被認為是真的邊界,那些低於 minval 的邊界會被拋棄。如果介於兩者之間的話,就要看這個點是否與某個被確定為真正的邊界點相連,如果是就認為它也是邊界點,如果不是就拋棄。如下圖:
a 高於閾值 maxval 所以是真正的邊界點, c 雖然低於 maxval 但高於minval 並且與 a 相連,所以也被認為是真正的邊界點。而 b 就會被拋棄,因為他不僅低於 maxval 而且不與真正的邊界點相連。所以選擇合適的 maxval和 minval 對於能否得到好的結果非常重要。
在這一步一些小的雜訊點也會被除去,因為我們假設邊界都是一些長的線段。
2、opencv 中的 canny 邊界檢測
在 opencv 中只需要乙個函式: cv2.canny(),就可以完成以上幾步。這個函式的第乙個引數是輸入影象。第二和第三個分別是 minval 和 maxval。第三個引數設定用來計算影象梯度的 sobel卷積核的大小,預設值為 3,最後乙個引數是 l2gradient,它可以用來設定求梯度大小的方程。如果設為 true,就會使用我們上面提到過的方程,否則使用方程:
代替,預設值為 false。
結果圖:import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image/lufei.jpeg',0)
edges = cv2.canny(img, 100, 200)
plt.subplot(1,2,1),plt.imshow(img,cmap='gray')
plt.title('original'),plt.xticks(),plt.yticks()
plt.subplot(1,2,2),plt.imshow(edges ,cmap='gray')
plt.title('edge image'),plt.xticks(),plt.yticks()
plt.show()
參考:opencv官方教程中文版(for python)
OpenCV Canny邊緣檢測
文章介紹如何用opencv python來使用canny運算元。本文介紹使用opencv python實現基本的濾波處理 本文不介詳細的理論知識,讀者可從其他資料中獲取相應的背景知識。筆者推薦清華大學出版社的 影象處理與計算機視覺演算法及應用 第2版 原型 opencv python中canny函式...
《OpenCV》 Canny 邊緣檢測
1 去噪 邊緣檢測容易受到影象中雜訊的影響,故首先需要用5x5的高斯濾波器去除影象中的雜訊。2 計算影象的強度梯度 將去噪 平滑 後的影象由sobel核心分別在水平和垂直方向上求導 一階微分 得到gx和gy。根據這兩幅梯度圖,求得每個畫素的邊緣梯度大小和方向。3 非極大值抑制 得到梯度大小和方向後,...
opencv Canny邊緣檢測
原影象 cv imshow 原影象 imagesource cv mat image cv gaussianblur imagesource,image,cv size 3,3 0 過濾 cv canny image,image,50,100 邊緣檢測 第乙個引數 輸入影象 八位的影象 第二個引數 ...