1. 程式人生 > >【OpenCV】影象變換(二)邊緣檢測:梯度運算元、Sobel運算元和Laplace運算元

【OpenCV】影象變換(二)邊緣檢測:梯度運算元、Sobel運算元和Laplace運算元

邊緣

邊緣(edge)是指影象區域性強度變化最顯著的部分。主要存在於目標與目標、目標與背景、區域與區域(包括不同色彩)之間,是影象分割、紋理特徵和形狀特徵等影象分析的重要基礎。

影象強度的顯著變化可分為:
•階躍變化函式,即影象強度在不連續處的兩邊的畫素灰度值有著顯著的差異;
•線條(屋頂)變化函式,即影象強度突然從一個值變化到另一個值,保持一較小行程後又回到原來的值。

影象的邊緣有方向和幅度兩個屬性,沿邊緣方向畫素變化平緩,垂直於邊緣方向畫素變化劇烈.邊緣上的這種變化可以用微分運算元檢測出來,通常用一階或二階導數來檢測邊緣。
這裡寫圖片描述
(a)(b)分別是階躍函式和屋頂函式的二維影象;(c)(d)是階躍和屋頂函式的函式圖象;(e)(f)對應一階倒數;(g)(h)是二階倒數。

一階導數法:梯度運算元

對於左圖,左側的邊是正的(由暗到亮),右側的邊是負的(由亮到暗)。對於右圖,結論相反。常數部分為零。用來檢測邊是否存在。
這裡寫圖片描述
梯度運算元 Gradient operators

函式f(x,y)在(x,y)處的梯度為一個向量:
這裡寫圖片描述
計算這個向量的大小為:
這裡寫圖片描述
近似為:
這裡寫圖片描述
梯度的方向角為:
這裡寫圖片描述

Sobel運算元

sobel運算元的表示:
這裡寫圖片描述
梯度幅值:
這裡寫圖片描述
用卷積模板來實現:
這裡寫圖片描述

二階微分法:拉普拉斯

二階微分在亮的一邊是負的,在暗的一邊是正的。常數部分為零。可以用來確定邊的準確位置,以及畫素在亮的一側還是暗的一側。
這裡寫圖片描述

LapLace 拉普拉斯運算元

二維函式f(x,y)的拉普拉斯是一個二階的微分,定義為:
這裡寫圖片描述
其中:
這裡寫圖片描述
可以用多種方式將其表示為數字形式。對於一個3*3的區域,經驗上被推薦最多的形式是:
這裡寫圖片描述
定義數字形式的拉普拉斯要求係數之和必為0
這裡寫圖片描述

其實在OpenCV中已經給出了相關的函式,下面我就將簡要的介紹下OpenCV中自帶的cvSobel()和cvLaplace()函式。

cvSobel(
    const CvArr* src,//輸入影象
    CvArr* dst,//輸出影象
    int xorder,
    int yorder,//x,y是求導的階數,只可能用到0,1,最多為2,0表示這個方向上沒有求導
    int
aperture_size=3 )

sobel導數有個很好的性質,即可以定義任意大小的核,並且這些核可以用快速且迭代方式構造。大核對導數有更好的逼近,因為小核對噪聲更敏感。sobel運算元其實不是真正的導數,因為sobel運算元作用的物件是離散空間。下面介紹下cvLaplace()函式。

void cvLaplace(
    const CvArr* src,//源影象可以是8點陣圖像,也可以是32點陣圖像
    CvArr* dst,//目標影象必須是16位或者32點陣圖像
    int aperturesize=3
)

在實際的OpenCV程式中,大家可以嘗試呼叫上述的函式進行影象邊緣的檢測,觀察檢測效果。