基於Python的Opencv學習

基於Python的Opencv學習第十一天

今天爲大家先介紹一下laplacian算子,來結束圖像梯度的內容,然後介紹一下canny邊緣檢測。

一.laplacian算子

laplacian算子類似於二階的sobel導數,因爲laplacian算子的卷積核不同,其卷積核如圖:
在這裏插入圖片描述
可以看到卷積核裏面的係數同sobel算子和scharr算子不同。其中,laplacian算子的計算公式爲:

P5=(p2+p4+p6+p8)-4*p5

來看示例:
在這裏插入圖片描述
來對比一下三種算子:
在這裏插入圖片描述
在這裏插入圖片描述
這裏可以看到完全是因爲三類算子其係數不同而導致結果不同。
在opencv裏面,利用

cv2.Laplacian(src,ddepth)

在這裏,dst爲結果圖像,src爲原圖像,ddepth爲圖像深度。

通常計算時,圖像深度使用更高的數據類型cv2.CV_64F,取絕對值後,再轉爲np.uint8(cv2.CV_8U)類型。

import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\lena.jpg")
laplacian=cv2.Laplacian(a,cv2.CV_64F)
laplacian=cv2.convertScaleAbs(laplacian)
cv2.imshow("a",a)
cv2.imshow("laplacian",laplacian)

在這裏插入圖片描述
可以看到代碼和結果。

二.Canny邊緣檢測

1.Canny邊緣檢測原理
Canny邊緣檢測的一般步驟分四步:
①去噪
邊緣檢測容易受到噪聲的影響,所以在進行邊緣檢測前要進行去噪處理,通常採用高斯濾波器去除噪聲

至於高斯濾波器的方法和使用,需要參考我以前的博客
即是讓臨近的像素具有更高的重要度,對周圍像素計算加權平均值,較近的像素具有較大的權重值(除以56的原因是加起來的值等於56,然後可以確保得到的值能夠在0~256之間)
在這裏插入圖片描述
②梯度
對平滑後的圖像採用sobel算子計算梯度和方向
梯度的計算前面博客介紹了,至於方向,首先計算水平方向的梯度和豎直方向上的梯度,然後通過算式:

Angle(α)=tan^-1(Gy/Gx)可以得到該點的方向
在這裏插入圖片描述
梯度的方向一般總是與邊界垂直,有四類:垂直,水平,以及兩個對角線方向。

在這裏插入圖片描述

③非極大值抑制
在獲取梯度和方向後,遍歷圖像,去除所有不是邊界的點。實現方法:逐個遍歷像素點,判斷當前像素點是否是周圍像素中具有相同方向梯度的最大值
在這裏插入圖片描述
如圖,點A,點B,點C三點具有相同的方向,梯度方向垂直於邊緣,判斷點A是否爲點A,點B,點C的局部最大值:如果是,保留該點;否則,該點被抑制(即像素值歸零)。

來看個例子:
在這裏插入圖片描述
黃色背景的值被保留,其餘點被抑制(處理爲0)

④滯後閾值
這裏我們選取兩個閾值,分別爲最大閾值和最小閾值在這裏插入圖片描述
看上圖右側,比邊界閾值大的保留,與邊界相連保留,其他的則拋棄。所以最後的結果爲:
在這裏插入圖片描述
這裏B和D被剔除,值被處理爲0。

來看一下邊緣處理的美:
在這裏插入圖片描述
2.Canny邊緣檢測函數
邊緣檢測的函數爲cv2.Canny(),具體格式爲:

edges=cv2.Canny(image,threshold1,threshold2)

參數說明:
edges爲邊界圖像
image爲原圖像
threshold1爲上面提到的閾值minVal
threshold2爲上面提到的閾值maxVal

調整閾值,可以控制邊緣細節:
maxVal,minVal變小,有更多的細節信息。

import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\lena.jpg")
r1=cv2.Canny(a,100,200)
r2=cv2.Canny(a,64,128)
cv2.imshow("a",a)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)

在這裏插入圖片描述

好的,今天的內容就結束了,爲大家重點介紹了canny邊緣檢測知識,大家好好理解一下吧(轉載註明出處)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章