目录
一、索贝尔(sobel)算子
二、沙尔(Scharr)算子
三、拉普拉斯算子
一、索贝尔(sobel)算子
边缘的定义:
边缘是像素值发生跃迁的位置,是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要的作用。
sobel算子对图像求一阶导数。一阶导数越大,说明像素在该方向的变化越大,边缘信号越强
案例代码如下:
import cv2
import numpy as np
img = cv2.imread('6.jpg')
# 计算水平方向的梯度,只有垂直方向的边缘
dx = cv2.Sobel(img,cv2.CV_64F,dx = 1,dy = 0,ksize=5)
# 计算垂直方向的梯度,只有水平方向的边缘
dy = cv2.Sobel(img,cv2.CV_64F,dx = 0,dy = 1,ksize=5)
# 可利用numpy的加法,直接整合两张图片
dst = dx + dy
# 也可利用opencv的加法
dst = cv2.add(dx,dy)
# 使用addWeighted也可以
dst = cv2.addWeighted(dx,0.5,dy,0.5,gamma=0)
cv2.imshow('dx',np.hstack((dx,dy,dst)))
# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()
二、沙尔(Scharr)算子
- Scharr算子只支持3*3的kernel所以没有kernel参数了
- Scharr算子只能求x方向或y方向的边缘
- Sobel算子的ksize设为-1就是Scharr算子
- Scharr擅长寻找细小的边缘一般用的较少
案例代码如下:
import cv2
import numpy as np
img = cv2.imread('6.jpg')
# 计算水平方向的梯度,只有垂直方向的边缘
dx = cv2.Scharr(img,cv2.CV_64F,dx = 1,dy = 0)
# 计算垂直方向的梯度,只有水平方向的边缘
dy = cv2.Scharr(img,cv2.CV_64F,dx = 0,dy = 1)
# 可利用numpy的加法,直接整合两张图片
dst = dx + dy
# 也可利用opencv的加法
dst = cv2.add(dx,dy)
# 使用addWeighted也可以
dst = cv2.addWeighted(dx,0.5,dy,0.5,gamma=0)
cv2.imshow('dx',np.hstack((dx,dy,dst)))
# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()
三、拉普拉斯算子
- 可以同时求两个方向的边缘
- 对噪音敏感一般需要先进行去噪再调用拉普拉斯
import cv2
import numpy as np
img = cv2.imread('6.jpg')
dst = cv2.Laplacian(img,-1,ksize=3)
cv2.imshow('img',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下: