sobel運算元:[-1 0 1
-2 0 2
-1 0 1]
用此運算元與原影象做卷積,可以檢測出垂直方向的邊緣。運算元作用在影象的第二列,結果是:200,200,200;作用在第三列,結果是:
200,200,200;
對當前列左右兩側的元素進行差分,由於邊緣的值明顯小於(或大於)周邊畫素,所以邊緣的差分結果會明顯不同,這樣就提取出了垂直邊緣。同理,把上面那個矩陣轉置一下,就是提取水平邊緣。這種差分操作就稱為影象的梯度計算。
概念: 把想象成連續函式,因為邊緣部分的畫素值是與旁邊畫素明顯有區別的,所以對區域性求極值,就可以得到整幅的邊緣資訊了。不過是二維的離散函式,導數就變成了差分,這個差分就稱為影象的梯度。
理解:求一階差分應該是指對影象相鄰畫素求取差分。
邊緣 – 是畫素值發生躍遷的地方(變化率最大處,導數最大處),是影象的顯著特徵之一,在影象特徵提取、物件檢測、模式識別等方面都有重要的作用。
sobel運算元和scharr運算元
(1)sobel運算元:是離散微分運算元(discrete differentiation operator),用來計算影象灰度的近似梯度,梯度越大越有可能是邊緣。
soble運算元的功能集合了高斯平滑和微分求導,又被稱為一階微分運算元,求導運算元,在水平和垂直兩個方向上求導,得到的是影象在x方法與y方向梯度影象。
缺點:比較敏感,容易受影響,要通過高斯模糊(平滑)來降噪。
運算元是通過權重不同來擴大差異。
梯度計算:(在兩個方向求導,假設被作用影象為 i)
水平變化: 將 i 與乙個奇數大小的核心 gx進行卷積。比如,當核心大小為3時, gx的計算結果為:
垂直變化: 將 i 與乙個奇數大小的核心 gy進行卷積。比如,當核心大小為3時, gy的計算結果為:
在影象的每一畫素上,結合以上兩個結果求出近似梯度:
有時也用下面更簡單公式代替,計算速度快:(最終影象梯度)。
(2)scharr:當核心大小為3時, 以上sobel核心可能產生比較明顯的誤差(畢竟,sobel運算元只是求取了導數的近似值)。 為解決這一問題,opencv提供了 scharr 函式,但該函式僅作用於大小為3的核心。該函式的運算與sobel函式一樣快,但結果卻更加精確,不怕干擾,其核心為:
(3)sobel/scharr提取邊緣(求導)步驟:
1)高斯模糊平滑降噪:
gaussianblur( src, dst, size(3,3), 0, 0, border_default );
2)轉灰度:
cvtcolor( src, gray, color_rgb2gray );
3)求x和y方向的梯度(求導):
sobel(gray_src, xgrad, cv_16s, 1, 0, 3);
sobel(gray_src, ygrad, cv_16s, 0, 1, 3);
scharr(gray_src, xgrad, cv_16s, 1, 0);
scharr(gray_src, ygrad, cv_16s, 0, 1);
4)畫素取絕對值:
convertscaleabs(a, b); //計算影象a的畫素絕對值,輸出到影象b
5)相加x和y,得到綜合梯度,稱為振幅影象:
addweighted( a, 0.5,b, 0.5, 0, ab); //混合權重相加,效果較差
或者迴圈獲取畫素,每個點直接相加,效果更好。
什麼是核?其實就是一組權重的集合,將這組權重集合放入源畫素中,會產生乙個新的畫素,就像一塊毛玻璃一樣在原始影象上移動,最亮的點經過核**畫素時,所生成新的畫素會比它周圍的更加突出,這就是把邊緣檢測了出來。
sobel運算元根據畫素點上下、左右鄰點灰度加權差,在邊緣處達到極值這一現象檢測邊緣。對雜訊具有平滑作用,提供較為精確的邊緣方向資訊,邊緣定位精度不夠高。當對精度要求不是很高時,是一種較為常用的邊緣檢測方法。
sobel運算元是典型的基於一階導數的邊緣檢測運算元,由於該運算元中引入了類似區域性加權平均的運算,因此對雜訊具有平滑作用,能很好的消除雜訊的影響。sobel運算元對於象素的位置的影響做了加權。
sobel運算元包含兩組3x3的矩陣,分別為橫向及縱向模板,將之與影象作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。
sobel運算元是典型的基於一階導數的邊緣檢測運算元,是離散型的差分運算元。該運算元對雜訊具有平滑作用,能很好的消除雜訊的影響。sobel運算元對於畫素的位置的影響做了加權,與prewitt運算元、roberts運算元相比因此效果更好。
sobel運算元包含兩組3x3的矩陣,分別為橫向及縱向模板,將之與影象作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。
x = cv2.sobel(img,cv2.cv_16s,1,0) #1,0代表只計算x方向計算邊緣
y = cv2.sobel(img,cv2.cv_16s,0,1) #0,1代表只在y方向計算邊緣
absx =cv2.convertscaleabs(x)
absy =cv2.convertscaleabs(y)
dst = cv2.addweighted(absx,0.5,absy,0.5,0)
cv2.imshow(
"absx
", absx)
cv2.imshow(
"absy
", absy)
cv2.imshow(
"result
", dst)
cv2.waitkey(0)
cv2.destroyallwindows()
測試:
執行結果:
Sobel 邊緣檢測
sobel邊緣檢測演算法 索貝爾運算元 sobel operator 主要用作邊緣檢測,在技術上,它是一離散性差分運算元,用來運算影象亮度函式的灰度之近似值。在影象的任何一點使用此運算元,將會產生對應的灰度向量或是其法向量 sobel 卷積因子為 該運算元包含兩組 3x3的矩陣,分別為橫向及縱向,將...
邊緣檢測 Sobel運算元
依賴opencv來做一些資料結構和顯示的工作,但主要的計算法部分是自己實現的。後面爭取依次給出常見的集中邊緣提取的演算法實現。下次補上原理推到說明。sobel.cpp 定義控制台應用程式的入口點。include stdafx.h include cv.h include highgui.h incl...
halcon sobel邊緣檢測sobel amp
sobel amp 使用sobel運算元檢測邊緣 幅度 sobel amp 邊緣影象 濾波器方式,掩膜大小 sobel amp計算影象的一階導數,並用作邊緣檢測器。過濾器基於以下過濾器掩碼 a 1 2 1 0 0 0 1 2 1 b 1 0 1 2 0 2 1 0 1 根據所選的過濾器型別,這些掩碼...