边缘检测(英语:Edge detection)是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。 边缘检测是图像处理和计算机视觉中,尤其是特征检测中的一个研究领域。
原理
边缘检测实质上就是通过对图像的卷积的结果,卷积是数学分析中一种重要的运算,主要区别在于卷积核的选择,通过卷积操作我们不仅可以做到边缘检测,还可以做到模糊图像、锐化图像等功能。
边缘检测的卷积核也叫做 边缘检测算子
如:Roberts Cross算子, Prewitt算子, Sobel算子, Canny算子,罗盘算子
这里以Sobel算子为例子:
A 代表原始图像,Gx和 Gy分别代表经横向及纵向边缘检测的图像
通过以上公式就可以分别计算出横向 和 纵向 的梯度值,即Gx和 Gy,梯度值越大,边缘就越明显。
注意:
计算梯度值前需要先把图像置灰,方便我们计算梯度值。
横向的梯度值检测出来的是纵向的边缘线,纵向的梯度值检测出来的是横向的边缘线。
以上是理论,可能有些小伙伴看得很懵逼,下面我们举一个例子来说明一下:
像素块一
像素块二
横向sobel算子
假如上图是我们在图像上随机选取的 两块 3*3 的像素块,以及横向的Sobel算子
最后我们取他们的绝对值, 分别 187 和 1, 这里我们就很明显的看到了他们的区别,梯度值越大,说明该像素越有可能是边缘!
Shader 代码实现:
首先我们需要把图像置灰,置灰非常简单,通过灰度心理学公式 Gray = R*0.299 + G*0.587 + B*0.114 转换即可!
这里我们分别对横向和纵向做边缘检测,以便于我们做对比,理解。
创建一个C#脚本拖拽到摄像机上:
using UnityEngine;
using System.Collections;
//-----------------------------【边缘检测】-----------------------------public class EdgeDetection : PostEffectsBase {
public Shader edgeDetectShader;
private