python opencv 邊緣檢測

2021-09-22 13:59:42 字數 3072 閱讀 5870

canny邊緣檢測器是一種被廣泛使用的演算法,並被認為是邊緣檢測最優的演算法,該方法使用了比高斯差分演算法更複雜的技巧,如多向灰度梯度和滯後閾值化

平滑影象:使用高斯濾波器與影象進行卷積,平滑影象,以減少邊緣檢測器上明顯的雜訊影響

計算影象的梯度和方向:影象中的邊緣可以指向各個方向,這裡計算影象的梯度,並將梯度分類為垂直、水平和斜對角。

雙閾值演算法檢測和連線邊緣:仍然存在由於雜訊和顏色變化引起的一些邊緣畫素。為了解決這些雜散響應,必須用弱梯度值過濾邊緣畫素,並保留具有高梯度值的邊緣畫素,可以通過選擇高低閾值來實現

canny = cv2.canny(image, threshold1, threshold2[

, edges[

, aperturesize[

, l2gradient ]]]

) 引數:

第乙個引數 處理的原影象,該影象必須為單通道的灰度圖;

第二個引數 最小閾值;

第三個引數 最大閾值。

)#轉化為灰度圖

img_color = img

blur = cv2.gaussianblur(img,(3

,3),

0)# 用高斯濾波處理原影象降噪

canny = cv2.canny(blur,50,

150)

# 50是最小閾值,150是最大閾值

cv2.namedwindow(

"canny",0

);#可調大小

cv2.namedwindow(

"1",0)

;#可調大小

參考sobel邊緣檢測演算法比較簡單,實際應用中效率比canny邊緣檢測效率要高,但是邊緣不如canny檢測的準確,sobel運算元是高斯平滑與微分操作的結合體,所以其抗雜訊能力很強,用途較多。尤其是效率要求較高,而對細紋理不太關係的時候,對於乙個彩色圖要先把它轉換為灰度圖

引數:第乙個引數是需要處理的影象;

第二個引數是影象的深度,-

1表示採用的是與原影象相同的深度。目標影象的深度必須大於等於原影象的深度;

dx和dy表示的是求導的階數,0表示這個方向上沒有求導,一般為0、1、2。

# sobel邊緣檢測運算元

)#轉化為灰度圖

x = cv2.sobel(img, cv2.cv_16s,1,

0)y = cv2.sobel(img, cv2.cv_16s,0,

1)# cv2.convertscaleabs(src[, dst[, alpha[, beta]]])

# 可選引數alpha是伸縮係數,beta是加到結果上的乙個值,結果返回uint型別的影象

scale_absx = cv2.convertscaleabs(x)

# convert 轉換 scale 縮放

scale_absy = cv2.convertscaleabs(y)

result = cv2.addweighted(scale_absx,

0.5, scale_absy,

0.5,0)

cv2.namedwindow(

"result",0

);#可調大小

cv2.namedwindow(

"1",0)

;#可調大小

在sobel函式的第二個引數這裡使用了cv2.cv_16s。因為opencv文件中對sobel運算元的介紹中有這麼一句:「in the case of 8-bit input images it will result in truncated derivatives」。即sobel函式求完導數後會有負值,還有會大於255的值。而原影象是uint8,即8位無符號數,所以sobel建立的影象位數不夠,會有截斷。因此要使用16位有符號的資料型別,即cv2.cv_16s。

在經過處理後,別忘了用convertscaleabs()函式將其轉回原來的uint8形式。否則將無法顯示影象,而只是一副灰色的視窗。

result = cv2.addweighted(src1, alpha, src2, beta, gamma[

, dst[

, dtype]

])

其中alpha是第一幅中元素的權重,beta是第二個的權重,gamma是加到最後結果上的乙個值。

參考:

Python opencv邊緣提取

題目描述 利用opencv或其他工具編寫程式實現影象的邊緣提取。實現過程 import cv2 import numpy as np imread 兩個引數 1 路徑。img cv2.imread r c users pc desktop test1.bmp cv2.imshow img img r...

Python Opencv Canny邊緣檢測

去噪 梯度 非極大值抑制 滯後閾值 梯度 角度 非極大值抑制 滯後閾值 梯度值 maxval 邊界 maxval 梯度值 minval 與邊界相連,保留。否則拋棄 梯度值 梯度值 ma xval maxv al 梯度 值 mi nval 梯度值nval 邊界與 邊界相連 保留。否則拋棄 拋棄 返回值...

opencv python Canny邊緣檢測

處理順序 1.彩色影象轉換成灰度圖 2.對影象進行高斯模糊 3.計算影象梯度 根據梯度計算 影象邊緣幅值與角度 4.非最大訊號壓制處理 在獲得梯度的方向和大小之後,應該對整幅影象做乙個掃瞄,去除那些非邊界上的點。對每乙個畫素進行檢查,看這個點的梯度是不是周圍具有相同梯度方向的點中最大的。5.雙閾值邊...