边缘检测的算法有很多种
这里介绍的是其中的一部分
- Sobel
- Prewitt
- Robert
- Line
这些卷积核,都是final g越大,越可能是边缘
-
Sobel
(-1,1), (0,1), (1,1)与(-1,-1),(0,-1),(1,-1)的亮度差距越大,特别是左右、上下的差异越大,则final g越大 -
Robert
uv_offset(0,1)与uv_offset(1,0)的亮度差距越大,则final g越大 -
Prewitt
(-1,1), (0,1), (1,1)与(-1,-1),(0,-1),(1,-1)的亮度差距越大,则final g越大 -
Line
Line的方式如果水平的上下差异越大、或是,垂直的左右差异越大,则final g越大
(注意line会更多的是本像素的一排x3一列x3的像素与上下,左右的来梯度差异,个人觉得这种会比较好,但是运算会比其他的多一些)
运行效果
Sobel
Prewitt
Roberts
Line
看看远一些(像素小一些)的效果
- Sobel
- Prewitt
- Roberts
- Line
可以看出Roberts、Line在处理像素临近的亮度(差异放大)放大后,效果比前两个号一些。
因为图像尺寸缩小,原本的梯度会比较平滑,但缩小后图像失真,原本比较平滑的会因失真后把梯度变大。
总结
- 图像边缘检测缺点
- 边缘附近的亮度相近的话,会有很多误差,导致很多不应该为边缘的,却判定为边缘,或是应该是边缘的,却没有判定为边缘
下次我们使用后处理的深度+法线来判定
References
- Feature Detectors
- Unity Shader入门教程(十八):卷积与边缘检测