【OpenCV】??高手勿入! 半小時學會基本操作 12??
- 概述
- Scharr 算子
- Laplacian 算子
- Sobel vs Scharr vs Laplacian
- Canny 邊緣檢測
- 高斯濾波器
- 梯度和方向
- 非極大值抑制
- 雙閾值檢測
- 例子
概述
OpenCV 是一個跨平臺的計算機視覺庫, 支持多語言, 功能強大. 今天小白就帶大家一起攜手走進 OpenCV 的世界. (第 12 課)

Scharr 算子
Scharr 算子和 Sobel 算子基本一樣. 只是卷積核系數不同. Scharr 算子對邊界更加敏感, 也更容易誤判.
卷積核引數:

例子:
# Scharr 算子
scharr_x = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharr_y = cv2.Scharr(img, cv2.CV_64F, 0, 1)
# 取絕對值
scharr_x = cv2.convertScaleAbs(scharr_x)
scharr_y = cv2.convertScaleAbs(scharr_y)
# 融合
scharr_xy = cv2.addWeighted(scharr_x, 0.5, scharr_y, 0.5, 0)
# 展示圖片
cv2.imshow("scharr_xy", scharr_xy)
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結果:

Laplacian 算子
拉普拉斯算子 (Laplacian) 是影像二階空間導數的二維向同性測度. 拉普拉斯算子可以突出影像中強度發生快速變化的區域, 因此常用在邊緣檢測任務當中.

在進行 Laplacian 操作之前通常需要先用高斯平滑濾波器 (Gaussian Blur) 降低 Laplacian 算子對于噪聲的敏感性.
卷積核引數:

例子:
# 讀取圖片, 并準換成灰度圖
img = cv2.imread("Mona_Lisa.jpg", cv2.IMREAD_GRAYSCALE)
# 高斯濾波器 (3 X 3)
img = cv2.GaussianBlur(img, (3, 3), sigmaX=0.1)
# Laplacian 算子
laplacian = cv2.Laplacian(img, cv2.CV_64F)
# 取絕對值
laplacian = cv2.convertScaleAbs(laplacian)
# 展示圖片
cv2.imshow("laplacian", laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結果:

注: Sigma 值越小, 模板的中心系數就越大, 周圍的系數較小, 平滑的效果就不是很明顯.
Sobel vs Scharr vs Laplacian

Canny 邊緣檢測
Canny 邊緣檢測是非常流行的一種邊緣檢測演算法, 由 John Canny 在 1986 年提出.
步驟:
- 使用高斯濾波器, 平滑影像, 消除噪聲
- 計算影像中每個像素點的梯度強度和方向
- 使用沒極大值抑制 (Non-Maximum Suppression) 消除邊緣檢測帶來的雜散回應
- 使用雙閾值檢測 (Double Threshold) 來確定真實和潛在的邊緣
- 通過抑制孤立的弱邊緣最終完成邊緣檢測
高斯濾波器

梯度和方向

非極大值抑制


雙閾值檢測

例子
# 讀取圖片, 并轉換成灰度圖
img = cv2.imread("Mona_Lisa.jpg", cv2.IMREAD_GRAYSCALE)
# Canny邊緣檢測
out1 = cv2.Canny(img, 50, 150)
out2 = cv2.Canny(img, 100, 150)
# 合并
canny = np.hstack((out1, out2))
# 展示圖片
cv2.imshow("canny", canny)
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290382.html
標籤:其他
下一篇:Docker-三劍客之machine、compose、swam集群、visualizer監控、stack部署集群、Portainer可視化
