【第14節(jié)】圖像梯度
目標(biāo)
原理
????????梯度簡(jiǎn)單來說就是求導(dǎo)。
????????OpenCV提供了三種不同的梯度濾波器,或者說高通濾波器:Sobel,Scharr和Laplacian。我們會(huì)意義介紹他們。
????????Sobel, Scharr其實(shí)就是求一階或二_階導(dǎo)數(shù)。Scharr 是對(duì)Sobel (使用小的卷積核求解求解梯度角度時(shí))的優(yōu)化。Laplacian 是求二階導(dǎo)數(shù)。
1、Sobel? 算子和 Scharr? 算子
????????Sobel算子是高斯平滑與微分操作的結(jié)合體,所以它的抗噪聲能力很好。你可以設(shè)定求導(dǎo)的方向( xorder或yorder )。還可以設(shè)定使用的卷積核的大小( ksize )。如果ksize=-1,會(huì)使用3x3的Scharr濾波器,它的的效果要比3x3的Sobel濾波器好(而且速度相同,所以在使用3x3濾波器時(shí)應(yīng)該盡量使用Scharr濾波器)。3x3 的Scharr濾波器卷積核如下:

2、Laplacian算子? ????
????????拉普拉斯算子可以使用二階導(dǎo)數(shù)的形式定義,可假設(shè)其離散實(shí)現(xiàn)類似于二階Sobel導(dǎo)數(shù),事實(shí)上,OpenCV 在計(jì)算拉普拉斯算子時(shí)直接調(diào)用Sobel算.子。計(jì)算公式如下:

拉普拉斯濾波器使用的卷積核:

實(shí)例演示:
????????下面的代碼分別使用以上三種濾波器對(duì)同一幅圖進(jìn)行操作。使用的卷積核都是5*5的。
結(jié)果:

一個(gè)中重要的事? ?
????????在查看.上面這個(gè)例子的注釋時(shí)不知道你有沒有注意到:當(dāng)我們可以通過參數(shù)-1來設(shè)定輸出圖像的深度(數(shù)據(jù)類型)與原圖像保持一致,但是我們?cè)诖a中使用的卻是CV2.CV_ 64F。這是為什么呢?想象一下一個(gè)從黑到白的邊界的導(dǎo)數(shù)是整數(shù),而一個(gè)從白到黑的邊界點(diǎn)導(dǎo)數(shù)卻是負(fù)數(shù)。如果原圖像的深度是np.int8時(shí),所有的負(fù)值都會(huì)被截?cái)嘧兂?,換句話說就是把把邊界丟失掉。所以如果這兩種邊界你都想檢測(cè)到,最好的的辦法就是將輸出的數(shù)據(jù)類型設(shè)置的更高,比如CV2.CV_ 16S, CV2.CV_ 64F等。取絕對(duì)值然后再把它轉(zhuǎn)回到CV2.CV_ 8U。下面的示例演示了輸出圖片的深度不同造成的不同效果。
結(jié)果:
