主流的邊緣檢測方法為:canny邊緣檢測。
其主要步驟為:
對影象進行降噪,常用高斯平滑
計算影象的梯度對可能的邊緣集合進行非極大值抑制雙閾值過濾篩選
影象降噪:
梯度運算元可以用於增強影象,本質上是通過增強邊緣輪廓來實現的,也就是說是可以檢測到邊緣的。但是它們容易受雜訊的影響。第一步就是想到要先去除雜訊,因為雜訊就是灰度變化很大的地方,所以容易被識別為偽邊緣。去除影象中「我們不感興趣」的「嘈雜」邊緣。
計算影象梯度:
影象的梯度相當於2個相鄰畫素之間的差值。
計算影象梯度能夠得到影象的邊緣,因為梯度是灰度變化明顯的地方,而邊緣也是灰度變化明顯的地方。當然這一步只能得到可能的邊緣。因為灰度變化的地方可能是邊緣,也可能不是邊緣。這一步計算了所有可能是邊緣的集合。
非極大值抑制:
通常灰度變化的地方都比較集中,灰度變化最大的保留下來,其它的不保留,這樣可以剔除掉一大部分的點。將有多個畫素寬的邊緣變成乙個單畫素寬的邊緣。即「胖邊緣」變成「瘦邊緣」。
雙閾值篩選:
設定雙閾值(low,high)
這樣做的目的是只保留強邊緣輪廓的話,有些邊緣可能不閉合。
# 由於邊緣檢測很容易受到雜訊影響,所以第一步是使用5x5 的高斯濾波器
# 去除雜訊,通過在邊緣檢測之前應用模糊,我們將幫助去除影象中「我們不感興趣」的「嘈雜」邊緣
canny = cv2.canny(image, 30, 150)
# cv2.canny(image, minval, maxval)
# 當影象的灰度梯度高於maxval 時被認為是真的邊界,
# 那些低於minval 的邊界會被拋棄。
# 如果介於兩者之間的話,就要看這個點是否與某個被確定為真正的邊界點相連,如果是就認為它也是邊界點,如果不是就拋棄。
當然,你也可以自己指定soble邊緣運算元求梯度:
#影象梯度
xgrad = cv2.sobel(image,cv2.cv_16sc1,1,0)
ygrad = cv2.sobel(image,cv2.cv_16sc1,0,1)
#計算邊緣
#50和150引數必須符合1:3或者1:2
canny = cv2.canny(xgrad,ygrad,50,150)
cv2.imshow("blurred", image)
cv2.imshow("canny", canny)
cv2.waitkey(0)
OpenCV Python 邊緣檢測
sobel運算元是一種具有方向性的邊緣檢測運算元,可以分別計算水平和垂直方向上的灰階突變。cv2.destroyallwindows cv2.sobel 函式中第三和第四個引數如果都取1,處理效果是檢測到傾斜方向上的邊緣,對水平和垂直方向上的邊緣都過濾掉了。laplacian基本上可以檢測出影象在各...
Python Opencv Canny邊緣檢測
去噪 梯度 非極大值抑制 滯後閾值 梯度 角度 非極大值抑制 滯後閾值 梯度值 maxval 邊界 maxval 梯度值 minval 與邊界相連,保留。否則拋棄 梯度值 梯度值 ma xval maxv al 梯度 值 mi nval 梯度值nval 邊界與 邊界相連 保留。否則拋棄 拋棄 返回值...
opencv python Canny邊緣檢測
處理順序 1.彩色影象轉換成灰度圖 2.對影象進行高斯模糊 3.計算影象梯度 根據梯度計算 影象邊緣幅值與角度 4.非最大訊號壓制處理 在獲得梯度的方向和大小之後,應該對整幅影象做乙個掃瞄,去除那些非邊界上的點。對每乙個畫素進行檢查,看這個點的梯度是不是周圍具有相同梯度方向的點中最大的。5.雙閾值邊...