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)