我們在上乙個教程中前面的例子學習了使用sobel邊緣檢測。原理是利用邊緣區域畫素值的跳變。通過求一階導數,可以使邊緣值最大化。如下圖所示:
那麼,如果求二階導數會得到什麼呢?
可以觀察到二階導數為0的地方。因此,可以利用該方法獲取影象中的邊緣。然而,需要注意的是二級導數為0的不只出現在邊緣地方,還可能是一些無意義的位置,根據需要通過濾波處理該情況。
二階微分
現在我們來討論二階微分,它是拉普拉斯運算元的基礎,與微積分中定義的微分略有不同,數字影象中處理的是離散的值,因此對於一維函式的一階微分的基本定義是差值:
類似的,二階微分定義為:
將一維函式擴充套件到二維:
二階微分的定義保證了以下幾點:
1、在恆定灰度區域的微分值為0
2、在灰度台階或斜坡的起點處微分值非零
可以看出,二階微分可以檢測出影象的邊緣、增強細節
拉普拉斯運算元
從上面的解釋,可以看出二階導數可以擁有邊緣檢測。由於影象是二維的,因此需要分別獲取兩個方向的導數。這裡使用的是拉普拉斯運算元來進行近似。
拉普拉斯運算元用下面公式定義:
其中:
實現上式的濾波器模板為:
我們可以發現,拉普拉斯運算元不需要向sobel運算元那樣分別對x,y方向進行處理,它可以直接處理,現在我們來看看opencv中的拉普拉斯運算元的函式原型:
dst = cv2.laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, bordertype]]]]])
如果看了上乙個教程中對於sobel運算元的介紹,這裡的引數應該不難理解。
前兩個是必須的引數:
第乙個引數是需要處理的影象;
第二個引數是影象的深度,-1表示採用的是與原影象相同的深度。目標影象的深度必須大於等於原影象的深度;
其後是可選的引數:
dst不用解釋了;
ksize是運算元的大小,必須為1、3、5、7。預設為1。
scale是縮放導數的比例常數,預設情況下沒有伸縮係數;
delta是乙個可選的增量,將會加到最終的dst中,同樣,預設情況下沒有額外的值加到dst中;
bordertype是判斷影象邊界的模式。這個引數預設值為cv2.border_default。
我們來看**:
現在可以拿這個結果對比上乙個教程的結果了,我們發現,這個結果要比上乙個教程的結果好的多,對於邊緣檢測沒有大的偏差。
然而事實上,這只是對於簡單的影象而言,而對於一幅複雜的影象,那麼邊緣提取就有點愛莫能助了,我們來看**:
可以看到,對於較為複雜的影象,拉普拉斯運算元的效果也並不是很好,由於二階微分一定的侷限性,目前的邊緣檢測還不夠完美,我們需要一種綜合的演算法,而這將在下乙個教程中介紹到。
OpenCV Python系列之相機校準
在本次教程中,我們將介紹 由相機引起的失真型別,如何找到相機的固有和非固有特性 如何根據這些特性使影象不失真 一些針孔相機會給影象帶來明顯的失真。兩種主要的變形是徑向變形和切向變形。徑向變形會導致直線出現彎曲。距影象中心越遠,徑向畸變越大。例如,下面顯示乙個影象,其中棋盤的兩個邊緣用紅線標記。但是,...
OpenCV Python系列之哈里斯角檢測
我們在上次簡述了opencv的特徵基礎原理,本次我們將步入實戰部分,開始進行特徵的初階檢測。原理 在上乙個教程中,我們知道了角點是影象中向任意方向發生改變時,都引起影象強烈變動的區域。chris harris 和 mike stephens 在他們1988年的 a combined corner a...
OpenCV Python系列 第二十二集 戴面具
tip 實時監測人臉,並戴上面具。coding utf 8 created on tue sep 4 08 50 53 2018 author administrator import cv2 def maskman face mask 獲取面具的寬高 h mask,w mask face mask...