unity 给图片边缘_Unity Shader - 边缘检测

边缘检测(英语: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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值