opencv常用邊緣檢測算子示例
- 1. Canny算子
- 2. Sobel算子
- 3. Scharr算子
- 4. Laplacian算子
- 5. 對比
1. Canny算子
從不同視覺對象中提取有用的結構信息并大大減少要處理的數據量的一種技術,檢測算法可以分為以下5個步驟:
- 噪聲過濾(高斯濾波)
- 計算圖像梯度(Sobel濾波)
- 非極大值抑制(消除邊緣檢測帶來的雜散響應)
- 雙閾值處理(確定真實和潛在的邊緣)
- 滯后閾值(抑制孤立的弱邊緣)
import cv2
import matplotlib.pyplot as plotimg = cv2.imread('tmp.jpg', cv2.IMREAD_GRAYSCALE)
# 第2、3參數分別是低、高閾值
es = cv2.Canny(img, 100, 200)plot.figure(figsize=(6,3))
plot.subplot(1,2,1)
plot.title('Source image')
plot.imshow(img)
plot.subplot(1,2,2)
plot.title('Canny')
plot.imshow(es)plt.show()
2. Sobel算子
一種離散一階導數的邊緣檢測算子,用于計算圖像灰度函數的近似梯度,常用于邊緣檢測和特征提取,可以分別計算圖像在X、Y方向的梯度。
import cv2
import numpy as np
import matplotlib.pyplot as plotimg = cv2.imread('tmp.jpg', cv2.IMREAD_GRAYSCALE)
sx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sy = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
sxy = np.sqrt(sx**2 + sy**2)
sxy = np.clip(sxy,0,255)plot.figure(figsize=(12,3))
plot.subplot(1,4,1)
plot.title('Source image')
plot.imshow(img)
plot.subplot(1,4,2)
plot.title('Sobel x')
plot.imshow(sx)
plot.subplot(1,4,3)
plot.title('Sobel y')
plot.imshow(sy)
plot.subplot(1,4,4)
plot.title('Sobel x+y')
plot.imshow(sxy)plt.show()
3. Scharr算子
由Scharr提出的,用于替代Sobel算子,用于需要更高精度的邊緣檢測時,作為高精度邊緣檢測算子,用法跟Sobel類似。
import cv2
import numpy as np
import matplotlib.pyplot as plotimg = cv2.imread('tmp.jpg', cv2.IMREAD_GRAYSCALE)
sx = cv2.Sobel(img, ddepth=cv2.CV_64F, dx=1, dy=0)
sy = cv2.Sobel(img, ddepth=cv2.CV_64F, dx=0, dy=1)
sx = cv2.convertScaleAbs(sx)
sy = cv2.convertScaleAbs(sy)
sxy = cv2.addWeighted(sx,0.5, sy, 0.5, 0)plot.figure(figsize=(12,3))
plot.subplot(1,4,1)
plot.title('Source image')
plot.imshow(img)
plot.subplot(1,4,2)
plot.title('Scharr x')
plot.imshow(sx)
plot.subplot(1,4,3)
plot.title('Scharr y')
plot.imshow(sy)
plot.subplot(1,4,4)
plot.title('Scharr x+y')
plot.imshow(sxy)plt.show()
4. Laplacian算子
一種基于二階導數的邊緣檢測方法,利用拉普拉斯算子來檢測圖像中強度變化的區域(邊緣),即通過計算圖像的二階導數,找到圖像亮度的突變點,從而定位邊緣的位置。
import cv2
import matplotlib.pyplot as plotimg = cv2.imread('tmp.jpg', cv2.IMREAD_GRAYSCALE)
la = cv2.Laplacian(img, cv2.CV_64F)plot.figure(figsize=(6,3))
plot.subplot(1,2,1)
plot.title('Source image')
plot.imshow(img)
plot.subplot(1,2,2)
plot.title('Laplacian')
plot.imshow(la)plt.show()
5. 對比
算法 | 優點 | 缺點 | 適用場景 |
---|---|---|---|
Canny 算子 | 噪聲抑制能力強,邊緣檢測效果好 | 參數調節較為復雜 | 通用邊緣檢測,適合大多數場景 |
Sobel 算子 | 計算簡單,適合檢測水平和垂直邊緣 | 對噪聲敏感,邊緣檢測效果一般 | 檢測水平和垂直邊緣 |
Scharr 算子 | 對邊緣的響應更強,適合檢測細微邊緣 | 對噪聲敏感 | 檢測細微的邊緣 |
Laplacian 算子 | 可以檢測邊緣和角點 | 對噪聲非常敏感 | 檢測邊緣和角點 |
系列文章:
- opencv常用邊緣檢測算子示例
- 圖像顏色空間對比(Opencv)
- 圖像變換方式區別對比(Opencv)
- 常用圖像濾波及色彩調節操作(Opencv)
- 圖像形態學操作對比(Opencv)