目錄
- 概述
- Scharr 算子
- Laplacian 算子
- Sobel vs Scharr vs Laplacian
- Canny 邊緣檢測(cè)
- 高斯濾波器
- 梯度和方向
- 非極大值抑制
- 雙閾值檢測(cè)
- 例子
【OpenCV】⚠️高手勿入! 半小時(shí)學(xué)會(huì)基本操作⚠️ 邊緣檢測(cè)
概述
OpenCV 是一個(gè)跨平臺(tái)的計(jì)算機(jī)視覺庫, 支持多語言, 功能強(qiáng)大. 今天小白就帶大家一起攜手走進(jìn) OpenCV 的世界. (第 12 課)
![](/d/20211017/e321062e4fbf5032a77cba4cb115f39d.gif)
Scharr 算子
Scharr 算子和 Sobel 算子基本一樣. 只是卷積核系數(shù)不同. Scharr 算子對(duì)邊界更加敏感, 也更容易誤判.
卷積核參數(shù):
![](/d/20211017/9859ea9e5e69238a45cde71015ee1869.gif)
例子:
# Scharr 算子
scharr_x = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharr_y = cv2.Scharr(img, cv2.CV_64F, 0, 1)
# 取絕對(duì)值
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()
輸出結(jié)果:
![](/d/20211017/5d279a109ca8ab700e5e8b2f556183aa.gif)
Laplacian 算子
拉普拉斯算子 (Laplacian) 是圖像二階空間導(dǎo)數(shù)的二維向同性測(cè)度. 拉普拉斯算子可以突出圖像中強(qiáng)度發(fā)生快速變化的區(qū)域, 因此常用在邊緣檢測(cè)任務(wù)當(dāng)中.
![](/d/20211017/2d718910a513af6effbb6976f73fa009.gif)
在進(jìn)行 Laplacian 操作之前通常需要先用高斯平滑濾波器 (Gaussian Blur) 降低 Laplacian 算子對(duì)于噪聲的敏感性.
卷積核參數(shù):
![](/d/20211017/59bccca9858c3d17f3a22c818f8f20b3.gif)
例子:
# 讀取圖片, 并準(zhǔn)換成灰度圖
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)
# 取絕對(duì)值
laplacian = cv2.convertScaleAbs(laplacian)
# 展示圖片
cv2.imshow("laplacian", laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結(jié)果:
![](/d/20211017/6001ac62f54a2df9d0141e1da3d12d5a.gif)
注: Sigma 值越小, 模板的中心系數(shù)就越大, 周圍的系數(shù)較小, 平滑的效果就不是很明顯.
Sobel vs Scharr vs Laplacian
![](/d/20211017/5c619734eeca1383b5f670be2267fe89.gif)
Canny 邊緣檢測(cè)
Canny 邊緣檢測(cè)是非常流行的一種邊緣檢測(cè)算法, 由 John Canny 在 1986 年提出.
步驟:
- 使用高斯濾波器, 平滑圖像, 消除噪聲
- 計(jì)算圖像中每個(gè)像素點(diǎn)的梯度強(qiáng)度和方向
- 使用沒極大值抑制 (Non-Maximum Suppression) 消除邊緣檢測(cè)帶來的雜散響應(yīng)
- 使用雙閾值檢測(cè) (Double Threshold) 來確定真實(shí)和潛在的邊緣
- 通過抑制孤立的弱邊緣最終完成邊緣檢測(cè)
高斯濾波器
![](/d/20211017/57d3ec8d3c48f3b544642e2fd01b2079.gif)
梯度和方向
![](/d/20211017/04b5c9d09cfb2b675bed502eb1d38405.gif)
非極大值抑制
![](/d/20211017/f9d3b090263c239239c2abf940f6e60f.gif)
![](/d/20211017/5b1ebc1a8347e25b1dde34ad176521af.gif)
雙閾值檢測(cè)
![](/d/20211017/8b06d66a9a30044271c3f86152851c33.gif)
例子
# 讀取圖片, 并轉(zhuǎn)換成灰度圖
img = cv2.imread("Mona_Lisa.jpg", cv2.IMREAD_GRAYSCALE)
# Canny邊緣檢測(cè)
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()
輸出結(jié)果:
![](/d/20211017/2188369d500ba8a63c281f68729e5a13.gif)
到此這篇關(guān)于OpenCV半小時(shí)掌握基本操作之邊緣檢測(cè)的文章就介紹到這了,更多相關(guān)OpenCV邊緣檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python OpenCV實(shí)現(xiàn)邊緣檢測(cè)
- OpenCV中Canny邊緣檢測(cè)的實(shí)現(xiàn)
- Python實(shí)現(xiàn)Opencv cv2.Canny()邊緣檢測(cè)
- 使用Python中OpenCV和深度學(xué)習(xí)進(jìn)行全面嵌套邊緣檢測(cè)
- OpenCV實(shí)現(xiàn)灰度、高斯模糊、邊緣檢測(cè)的示例
- Python使用Opencv實(shí)現(xiàn)邊緣檢測(cè)以及輪廓檢測(cè)的實(shí)現(xiàn)
- 如何利用Python 進(jìn)行邊緣檢測(cè)
- python實(shí)現(xiàn)canny邊緣檢測(cè)