java 图像梯度检测_数字图像处理-边缘检测

梯度介绍

首先介绍边缘检测中用到的高等数学原理---梯度。介绍梯度,离不开方向导数。

方向导数

顾名思义,方向导数就是某个方向上的导数。

什么是方向:

java 图像梯度检测_数字图像处理-边缘检测_第1张图片

函数

在这个方向上的图像:

java 图像梯度检测_数字图像处理-边缘检测_第2张图片

我们知道:

java 图像梯度检测_数字图像处理-边缘检测_第3张图片

函数

点在这个方向上也是有切线的,其切线的斜率就是方向导数:

java 图像梯度检测_数字图像处理-边缘检测_第4张图片

梯度

梯度:是一个矢量,它的方向上的方向导数最大,它的大小正好是此最大方向导数。

梯度的数学定义

java 图像梯度检测_数字图像处理-边缘检测_第5张图片

简单总结下:

方向导数是各个方向上的导数

偏导数连续才有梯度存在

梯度的方向是方向导数中取到最大值的方向,梯度的值是方向导数的最大值

2. 边缘检测

《经典边缘检测算子比较》 张丽 南京信息工程大学

图像的边缘是图像最基本的特征之一。所谓边缘(或边沿)是指周围像素灰度有跳跃性变化或“屋顶”变化的那些像素的集合。边缘是图像局部强度变化最明显的地方,它主要存在于目标与目标、目标与背景、区域与区域之间,因此它是图像分割依赖的重要特征。

从本质上说,图像边缘是图像局部特性不连续性(灰度突变、颜色突变、纹理结构突变等)的反应,它标志着一个区域的终结和另一个区域的开始。

边缘检测是所有基于边界分割的图像分析方法的第一步。

检测出的边缘并不等同于实际目标的真实边缘。由于图像数据时二维的,而实际物体是三维的,从三维到二维的投影必然会造成信息的丢失,再加上成像过程中的光照不均和噪声等因素的影响,使得有边缘的地方不一定能被检测出来,而检测出的边缘也不一定代表实际边缘。

图像的边缘有方向和幅度两个属性,沿边缘方向像素变化平缓,垂直于边缘方向像素变化剧烈。边缘上的这种变化可以用微分算子检测出来,通常用一阶或两阶导数来检测边缘。一阶导数认为最大值对应边缘位置,而二阶导数则以过零点对应边缘位置。

java 图像梯度检测_数字图像处理-边缘检测_第6张图片

图像的梯度可以用一阶导数和二阶偏导数来求解。但图像是离散的,对一幅图像的求导相当于对一个面求导。对图像的操作,我们采用模板对原图像进行卷积运算,从而达到我们想要的效果。而获取一幅图像的梯度就转化为:模板(Roberts、Prewitt、Sobel、Lapacian算子)对原图像进行卷积,不过这里的模板并不是随便设计的,而是根据数学中求导理论推导出来的。

Roberts算子

梯度的模为

089d84b2a43bd168dc04fee5508b22fa.png

在图像处理中,实际我们用

3ce0371cbcafee042513e1b908139d76.png

397bd3a79267f69732841d335b858a58.png来表示两个偏导数

故,梯度的模可以表示为:

81378d3c393d6d06f8d40b975c8107d9.png

因为平方和平方根需要大量的计算开销,所以使用绝对值来近似梯度幅值:

5e7a352ca3812afdad9a81b149612862.png

一般我们常用对角线方向的像元计算梯度

java 图像梯度检测_数字图像处理-边缘检测_第7张图片

Prewitt和Sobel算子

在3*3模板中:

java 图像梯度检测_数字图像处理-边缘检测_第8张图片

定义水平、垂直和两对角线方向的梯度:

java 图像梯度检测_数字图像处理-边缘检测_第9张图片 

该定义下的算子称之为Prewitt算子:

java 图像梯度检测_数字图像处理-边缘检测_第10张图片

Sobel算子是在Prewitt算子的基础上改进的,在中心系数上使用一个权值2,相比较Prewitt算子,Sobel模板能够较好的抑制(平滑)噪声。

计算公式为:

java 图像梯度检测_数字图像处理-边缘检测_第11张图片 

Sobel算子:

java 图像梯度检测_数字图像处理-边缘检测_第12张图片

上述所有算子都是通过求一阶导数来计算梯度的,用于线的检测,在图像处理中,通常用于边缘检测。在图像处理过程中,除了检测线,有时候也需要检测特殊点,这就需要用二阶导数进行检测。

你可能感兴趣的:(java,图像梯度检测)