OpenGL ES入门08-图像边缘检测
前言
本文是关于OpenGL ES的系统性学习过程,记录了自己在学习OpenGL ES时的收获。
这篇文章的目标是学习OpenGL ES 2.0中的像素点的代数运算。
环境是Xcode8.1+OpenGL ES 2.0
目前代码已经放到github上面,OpenGL ES入门08-图像边缘检测
欢迎关注我的 OpenGL ES入门专题
概述
边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括:1、深度上的不连续;2、表面方向不连续;3、物质属性变化;4、场景照明变化。 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。
Canny 算子
Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。Canny算子是一个具有滤波,增强,检测的多阶段的优化算子,在进行处理前,Canny算子先利用高斯平滑滤波器来平滑图像以除去噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度幅值和方向,在处理过程中,Canny算子还将经过一个非极大值抑制的过程,最后Canny算子还采用两个阈值来连接边缘。
Canny算子求边缘点具体算法步骤如下
- 用高斯滤波器平滑图像。
- 用一阶偏导有限差分计算梯度幅值和方向
- 对梯度幅值进行非极大值抑制
- 用双阈值算法检测和连接边缘.
Laplacian 算子
Laplace算子是一种各向同性算子,二阶微分算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生成一个新的模板。
二维函数f(x,y)的拉普拉斯是一个二阶的微分,定义为:
其中:
二阶的微分
拉普拉斯算子还可以表示成模板的形式:
拉普拉斯算子
拉普拉斯算子扩展模板
扩展模板形式
Sobel 算子
Sobel算子是计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。Sobel算子并没有将图像的主题与背景严格地区分开来,也就是Sobel算子并没有基于图像灰度进行处理,由于Sobel算子并没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。
检测水平边沿横向模板
横向模板
检测垂直平边沿纵向模板
纵向模板
图像梯度的大小
梯度公式
梯度方向
梯度方向公式
对于给定的图像
1351141152_6697.png
近似公式的计算的结果
1351141247_8193.png
参考资料
《OpenCV3编程入门》