数字图像处理之图像边缘
数字图像处理之图像边缘
1.Prewitt、Roberts算子
Prewitt算子
检测水平或者竖直方向的梯度
特点:有正有负,和为0,有水平竖直两种
效果:均匀的部分接近零,变化大的部分数值大。可以描绘边缘
竖直与水平两种算子
效果
合成梯度为绝对值相加,或者平方和开根号,前者运算更快
锐化:将原图加上边缘,突出边缘
代码实现
1 | kx = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=np.float32) |
Roberts算子
检测斜方向的梯度
算子
效果
代码实现
1 | kx = np.array([[-1, 0], [0, 1]], dtype=np.float32) |
2.Sobel、Scharr算子
Sobel算子
算子
效果
代码实现
1 | imgX = cv.Sobel(img, cv.CV_16S, 1, 0) #(原图像,数据类型,dx,dy),dx、dy为偏导,x一阶偏导y零阶偏导为水平方向检测 |
Scharr算子
几乎与Sobel算子一样
算子
代码实现
1 | imgX = cv.Scharr(img, cv.CV_64F, 1, 0) |
3.Laplacian、LoG算子
效果
算子
LoG算子处理:先高斯模糊,再Laplacian。现实中使用很少
代码实现
1 |
|
4.Canny边缘检测
效果好、经典、应用广泛的边缘检测算法
效果
步骤:
- 平滑:模糊削弱噪声。(通常为高斯滤波)
- 计算梯度:梯度包括大小和方向,有x和y方向合成。
- 细化边缘:利用非极大值抑制,只有局部最大值保留为边缘。
- 双阈值抑制:根据大小两个阈值,高于高于大阈值的为确定边缘(强边缘);低于小阈值的不是边缘;处于两者之间的像素点(弱边缘)下一步确定。
- 边缘追踪:对于若边缘,如果和强边缘相连,则确定为边缘,否则不是边缘。
代码实现
1 | img_edge = cv.Canny(img, 20, 200) |
Canny编程实现
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Eureka!
评论