高版本的opencv-python部分算法涉及專利保護,可以降到3.4.2.16版本
安裝:
pip install opencv-python==3.4.2.16
pip install opencv_contrib_python==3.4.2.16
原理:
1,方法一
利用‘膨脹’ 與 ‘腐蝕’ 對圖像進行處理,由于這兩個操作隻發生在邊緣,是以可以将兩幅圖像相減得到邊緣
圖檔:

利用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)
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)
關于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範數(直接将兩個方向導數的絕對值相加)。