Sobel邊緣檢測

2022-02-15 01:23:08 字數 3485 閱讀 7152

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 根據所選的過濾器型別,這些掩碼...