簡要描述
sobel運算元主要用於獲得數字影象的一階梯度,常見的應用是邊緣檢測。
原理運算元使用兩個3*3的矩陣(圖1)運算元使用兩個3*3的矩陣(圖1)去和原始作卷積,分別得到橫向g(x)和縱向g(y)的梯度值,如果梯度值大於某乙個閾值,則認為該點為邊緣點
圖1:卷積矩陣
圖2:卷積運算
影象直接卷積實現sobel:
//影象直接卷積實現sobel
bool sobeledge(const cv::mat image, cv::mat &result, uchar threshold)
}//計算梯度模長
gramag = sqrt(pow(edgex, 2) + pow(edgey, 2));
//二值化
result.at(i - 1, j - 1) = ((gramag > threshold) ? 255 : 0);
} }return true;
}
執行結果:
非極大值抑制sobel邊緣實現:
//非極大值抑制實現sobel豎直細化邊緣
bool sobelveredge(cv::mat image, cv::mat &result)
} resulttempmat.convertto(resulttempmat, cv_8uc1);
result = resulttempmat.clone();
return true;
}
執行結果:
在opencv中,sobel運算元在c++中的函式原型如下:
void sobel(inputarray src, outputarray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1, double delta=0, int bordertype=border_default )
inputarray src:輸入的原影象,mat型別
outputarray dst:輸出的邊緣檢測結果影象,mat型,大小與原影象相同。
int ddepth:輸出影象的深度,針對不同的輸入影象,輸出目標影象有不同的深度,具體組合如下:
- 若src.depth() = cv_8u, 取ddepth =-1/cv_16s/cv_32f/cv_64f
- 若src.depth() = cv_16u/cv_16s, 取ddepth =-1/cv_32f/cv_64f
- 若src.depth() = cv_32f, 取ddepth =-1/cv_32f/cv_64f
- 若src.depth() = cv_64f, 取ddepth = -1/cv_64f
注:ddepth =-1時,代表輸出影象與輸入影象相同的深度。
int dx:int型別dx,x 方向上的差分階數,1或0
int dy:int型別dy,y 方向上的差分階數,1或0
其中,dx=1,dy=0,表示計算x方向的導數,檢測出的是垂直方向上的邊緣;dx=0,dy=1,表示計算y方向的導數,檢測出的是水平方向上的邊緣。
int ksize:為進行邊緣檢測時的模板大小為ksize*ksize,取值為1、3、5和7,其中預設值為3。
**實現:
int main()
執行結果:
邊緣檢測運算元
看了很多邊緣檢測的文章,有些不夠詳細,有些不算綜合,所以打算總結一下!以下內容均為個人理解,如有問題,望指正!首先,我想要解釋一下什麼是邊緣。通俗地講,灰度值變化劇烈的地方就是邊緣。那麼如何判斷灰度值變化?如何度量 劇烈 各類演算法給出了自己的規範或者說是原則。所以,各類運算元就跳出來了。由於各類運...
邊緣檢測運算元
sobel amp image edgeamplitude filtertype,size 根據影象的一次導數計算影象的邊緣 close edges edges,edgeimage regionresult minamplitude close edges length edges,gradient...
邊緣檢測運算元
1.sobel運算元 索貝爾 主要思想是 利用影象畫素點的上下左右的畫素點進行加權差,邊緣的差值會較大,從而得到對應的邊緣。它是一種差分性運算元,包含3 3的橫向,縱向模板,分別對影象進行卷積,得到橫座標,縱座標的亮度差分值。計算出影象亮度函式的梯度近似值。它是一種基於一階導數的邊緣運算元。優點是能...