天天看點

[python] 膨脹腐蝕邊緣算法,Canny邊緣算法

高版本的opencv-python部分算法涉及專利保護,可以降到3.4.2.16版本

安裝:

pip install opencv-python==3.4.2.16

pip install opencv_contrib_python==3.4.2.16

原理:

1,方法一

利用‘膨脹’ 與 ‘腐蝕’ 對圖像進行處理,由于這兩個操作隻發生在邊緣,是以可以将兩幅圖像相減得到邊緣

圖檔:

[python] 膨脹腐蝕邊緣算法,Canny邊緣算法

 利用dilate() 與 erode()  absdiff()這三個主要函數進行處理

具體實作代碼如下:

import cv2 as cv

im=cv.imread('building.jpg',0)
#建立結構化2*2矩形對象
kernel=cv.getStructuringElement(cv.MORPH_RECT,(2,2))
#膨脹
dilate=cv.dilate(im,kernel)
#腐蝕
erode=cv.erode(im,kernel)
#圖像相減
image=cv.absdiff(dilate,erode)

#由于邊緣線條為白色,背景為黑色,可以将像素取反
image=cv.bitwise_not(image)

cv.namedWindow('result',cv.WINDOW_NORMAL)
cv.imshow('result',image)
cv.waitKey(0)
           
[python] 膨脹腐蝕邊緣算法,Canny邊緣算法

2,方法二

Canny算法  

canny邊緣檢測算子是John F. Canny于 1986 年開發出來的一個多級邊緣檢測算法。 

一個最優的邊緣檢測算法,最優邊緣檢測的含義是:

好的檢測- 算法能夠盡可能多地辨別出圖像中的實際邊緣。

好的定位- 辨別出的邊緣要盡可能與實際圖像中的實際邊緣盡可能接近。

最小響應- 圖像中的邊緣隻能辨別一次,并且可能存在的圖像噪聲不應辨別為邊緣。

canny的算法步驟

①高斯模糊 - GaussianBlur

②灰階轉換 - cvtColor

③計算梯度 – Sobel/Scharr

④非最大信号抑制

⑤高低門檻值輸出二值圖像

import cv2 as cv
#canny邊緣檢測算法
im=cv.imread('building.jpg',cv.IMREAD_COLOR)
#高斯模糊
blurred_img=cv.GaussianBlur(im,(3,3),0)
#cvtcolor灰階轉換
gray_img=cv.cvtColor(blurred_img,cv.COLOR_RGB2GRAY)
#sobal計算梯度
xgred=cv.Sobel(gray_img,cv.CV_16SC1,1,0)
ygred=cv.Sobel(gray_img,cv.CV_16SC1,1,0)
image=cv.Canny(xgred,ygred,50,150)
#image = cv.Canny(gray_img, 50, 150)
color_img=cv.bitwise_and(im,im,mask=image)
result=cv.bitwise_not(image)
cv.namedWindow('origin',cv.WINDOW_NORMAL)
cv.namedWindow('canny_result',cv.WINDOW_NORMAL)
cv.namedWindow('color_img',cv.WINDOW_NORMAL)
cv.imshow('origin',im)
cv.imshow('canny_result',result)
cv.imshow('color_img',color_img)
cv.waitKey(0)

           
[python] 膨脹腐蝕邊緣算法,Canny邊緣算法

關于Canny的兩種邊緣查找函數模型

1,直接調用Canny算法在單通道灰階圖像中查找邊緣

其函數原型為:Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) -> edges

image = cv.Canny(gray_img, 50, 150)
           

image參數表示8位輸入圖像。

threshold1參數表示設定的低門檻值。

threshold2參數表示設定的高門檻值,一般設定為低門檻值的3倍 (根據Canny算法的推薦)。

edges參數表示輸出邊緣圖像,單通道8位圖像。

apertureSize參數表示Sobel算子的大小。

L2gradient參數表示一個布爾值,如果為真,則使用更精确的L2範數進行計算(即兩個方向的倒數的平方和再開方),否則使用L1範數(直接将兩個方向導數的絕對值相加)。

2,使用帶自定義圖像漸變的Canny算法在圖像中查找邊緣

其函數原型為:Canny(dx, dy, threshold1, threshold2[, edges[, L2gradient]]) -> edges

dx參數表示輸入圖像的x導數(x導數滿足16位,選擇CV_16SC1或CV_16SC3)

dy參數表示輸入圖像的y導數(y導數滿足16位,選擇CV_16SC1或CV_16SC3)。

threshold1參數表示設定的低門檻值。

threshold2參數表示設定的高門檻值,一般設定為低門檻值的3倍 (根據Canny算法的推薦)。

edges參數表示輸出邊緣圖像,單通道8位圖像。

L2gradient參數表示L2gradient參數表示一個布爾值,如果為真,則使用更精确的L2範數進行計算(即兩個方向的倒數的平方和再開方),否則使用L1範數(直接将兩個方向導數的絕對值相加)。