通常使用Roberts、Prewitt、Sobel算子计算梯度,在图像处理时,梯度值比较常见的应用是用来计算边缘检测。
其原理是通过算子,计算出图像每一个像素的梯度值,再通过判断梯度值的大小,来判定该像素是不是边缘像素。判定方式有很多种,可以直接用梯度作为权,用来在正常颜色和边缘颜色之间插值。也可以设定一个阙值,梯度值大于该阙值时,认为是边缘像素。
关于算子的计算原理,其实就是一个小型的矩阵,有3 x 3的,也有 9 x 9的等等,在遍历图像上的每一个像素时,按照该矩阵,选取出该像素周围的像素点,用来计算该像素与周围像素之间的关系。
对于梯度,每个算子都有两个分量,分别用来计算X方向和Y方向的梯度。对于X方向,一般都是从左到右,所以变化不大。但是对于Y方向,有些平台是从下往上(坐标原点在左下角),有些平台是从上往下(坐标原点在左上角)。我们需要根据实际情况翻转Y方向的梯度算子。
这里看一下百度百科中对 Sobel算子 的描述:
可以看到同样的Y方向梯度算子,前后描述并不一致,上下颠倒。这是因为在上面的描述中,遍历算子中像素的方式和下面不一样。当我们需要从左往右,从上往下遍历算子时,就应采用第一个公式。
我们在遍历算子时使用从左往右,从下往上的顺序,应采用第二个公式。
下面两个图片表示了3x3算子的两种不同的遍历顺序:
在本例中,我们采用的是,红色示例表示的遍历的顺序。
接下来给出本例中使用的算子:
Roberts算子
Gx
Gy
Prewitt算子
Gx
Gy
Sobel
Gx
Gy
接下来给出代码:
using UnityEn