8、算子操作: sobel 算子、 scharr****算子、拉普拉斯算子、Canny邊緣檢測
Sobel算子是一種離散的微分算子 ,結(jié)合高斯平滑和微分求導(dǎo)運(yùn)算。該算子利用局部差分尋找邊緣(近似等于微分),計算所得的是一個梯度的近似值,用來邊緣檢測的。
Sobel算子對圖像求一階導(dǎo)數(shù),一階導(dǎo)數(shù)越大,說明像素在該反向變換越大,邊緣信號越強(qiáng)。Sobel算子采用離散差分算子計算圖像像素點(diǎn)亮度值的近似梯度。
綜合考慮兩個方向的變化:
scharr算子與sobel算子類似
Laplacian算子則是求二階導(dǎo)
注:
一般情況下:
(1)一階導(dǎo)數(shù)通常會產(chǎn)生較粗的邊緣;
(2)二階導(dǎo)數(shù)對精細(xì)細(xì)節(jié),如細(xì)線、孤立點(diǎn)和噪聲有較強(qiáng)的響應(yīng);
(3)二階導(dǎo)數(shù)在灰度斜坡和灰度臺階過渡處會產(chǎn)生雙邊沿響應(yīng);
(4)二階導(dǎo)數(shù)的符號可以確定邊緣的過渡是從亮到暗還是從暗到亮;
(5)二階導(dǎo)數(shù)對細(xì)節(jié)更敏感。
def EdgeDetection():
# ---識別圖像的邊緣---#
# 邊緣是像素值發(fā)生躍遷的位置,
# sobel算子,[[-1,0,1],[-2,0,2],[-1,0,1]]
# 對圖像求一階導(dǎo),一階導(dǎo)數(shù)越大,說明像素在該方向變化越大,邊緣信號越強(qiáng)
chess = cv2.imread('./images/qi.jpg')
dx = cv2.Sobel(chess,-1,1,0,ksize=3)
dy = cv2.Sobel(chess,-1,0,1,3)
img_sobel = cv2.add(dx,dy)
img_sobel1 = cv2.addWeighted(dx,0.5,dy,0.5,0)
# scharr算子[[-3,0,3],[10,0,10],[-3,0,3]]
dx = cv2.Scharr(chess,-1,1,0)
dy = cv2.Scharr(chess,-1,0,1)
img_scharr = cv2.add(dx,dy)
# 拉普拉斯算子,二階求導(dǎo)
img_Lap = cv2.Laplacian(chess,-1,ksize=3)
# 卷積實(shí)現(xiàn)
kernel = np.array([[0,1,0],[1,-4,1],[0,1,0]])
img_L = cv2.filter2D(chess,-1,kernel)
# canny邊緣檢測
# 一般步驟:
# 1、先進(jìn)行去噪,高斯濾波
# 2、求梯度,對平滑后的圖像用sobel算子求梯度和方向,
# 方向用arctan(Gy/Gx),方向被歸為4類,垂直水平和兩個對角線
# 3、非極大抑制:去除不是邊界的點(diǎn),遍歷圖像,判斷當(dāng)前點(diǎn)是否是周圍像素點(diǎn)中具有相同方向上的梯度最大值
# 4、滯后閾值,設(shè)定邊界,最小和最大,保留之間的,且是連續(xù)的
img_canny = cv2.Canny(img,30,50)
cv2.imshow("imshow", np.hstack((img_Lap,img_L)))
cv2.waitKey(0)
cv2.destroyAllWindows()
Canny邊緣檢測算法
1、高斯模糊——gaussian
2、灰度轉(zhuǎn)換——cvtColor
3、計算梯度——Sobel/Scharr
4、非最大信號抑制
5、高低閾值輸出二值圖像
第一步:使用高斯濾波器進(jìn)行濾波,去除噪音點(diǎn)
第二步:使用sobel算子,計算出每個點(diǎn)的梯度大小和梯度方向
Sobel核在水平和垂直方向上對平滑的圖像進(jìn)行濾波,以在水平方向(Gx)和垂直方向(Gy)上獲得一階導(dǎo)數(shù)
第三步:使用非極大值抑制(只有最大的保留),消除邊緣檢測帶來的雜散效應(yīng)
在獲得梯度大小和方向后,將對圖像進(jìn)行全面掃描,以去除可能不構(gòu)成邊緣的所有不需要的像素。為此,在每個像素處,檢查像素是否是其在梯度方向上附近的局部最大值。
點(diǎn)A在邊緣(垂直方向)上。漸變方向垂直于邊緣。點(diǎn)B和C在梯度方向上。因此,將A點(diǎn)與B點(diǎn)和C點(diǎn)進(jìn)行檢查,看是否形成局部最大值。如果是這樣,則考慮將其用于下一階段,否則將其抑制(置為零)。簡而言之,得到的結(jié)果是帶有“細(xì)邊”的二進(jìn)制圖像。
第四步:應(yīng)用雙閾值(磁滯閾值),來確定真實(shí)和潛在的邊緣
需要兩個閾值minVal和maxVal。強(qiáng)度梯度大于maxVal的任何邊緣必定是邊緣,而小于minVal的那些邊緣必定是非邊緣,因此將其丟棄。介于這兩個閾值之間的對象根據(jù)其連通性被分類為邊緣或非邊緣。如果將它們連接到“邊緣”像素,則將它們視為邊緣的一部分。否則,它們也將被丟棄。
邊緣A在maxVal之上,因此被視為“確定邊緣”。盡管邊C低于maxVal,但它連接到邊A,因此也被視為有效邊,我們得到了完整的曲線。但是邊緣B盡管在minVal之上并且與邊緣C處于同一區(qū)域,但是它沒有連接到任何“確保邊緣”,因此被丟棄。因此,非常重要的一點(diǎn)是我們必須相應(yīng)地選擇minVal和maxVal以獲得正確的結(jié)果。
-
matlab
+關(guān)注
關(guān)注
185文章
2980瀏覽量
230796 -
圖像處理
+關(guān)注
關(guān)注
27文章
1299瀏覽量
56838 -
計算機(jī)視覺
+關(guān)注
關(guān)注
8文章
1700瀏覽量
46073 -
OpenCV
+關(guān)注
關(guān)注
31文章
635瀏覽量
41455
發(fā)布評論請先 登錄
相關(guān)推薦
評論