梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)
设二元函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在平面区域D上具有一阶连续偏导数,则对于每一个点P(x,y)都可定出一个向量
{ ∂ f ∂ x , ∂ f ∂ x } = f x ( x , y ) i ˉ + f y ( x , y ) j ˉ \{\frac {\partial f}{\partial x},\frac {\partial f}{\partial x}\}=f_x(x,y)\bar i+f_y(x,y)\bar j {∂x∂f,∂x∂f}=fx(x,y)iˉ+fy(x,y)jˉ,该函数就称为函数 z = f ( x , y ) z=f(x,y) z=f(x,y)在点P(x,y)的梯度,记作gradf(x,y)或 ▽ f ( x , y ) \triangledown f(x,y) ▽f(x,y)
g r a d f ( x , y ) = ▽ f ( x , y ) = { ∂ f ∂ x , ∂ f ∂ x } = f x ( x , y ) i ˉ + f y ( x , y ) j ˉ gradf(x,y)=\triangledown f(x,y)=\{\frac {\partial f}{\partial x},\frac {\partial f}{\partial x}\}=f_x(x,y)\bar i+f_y(x,y)\bar j gradf(x,y)=▽f(x,y)={∂x∂f,∂x∂f}=fx(x,y)iˉ+fy(x,y)jˉ
其中 ▽ = ∂ ∂ x i ˉ + ∂ ∂ x j ˉ \triangledown =\frac {\partial }{\partial x}\bar i+\frac {\partial }{\partial x}\bar j ▽=∂x∂iˉ+∂x∂jˉ 称为(二维的)向量微分算子或Nabla算子
视频讲解
在微积分中,一维函数的一阶微分的基本定义是这样的:
d f d x = lim ϵ → 0 f ( x + ϵ ) − f ( x ) ϵ \frac {df}{dx} = \lim_{\epsilon\rightarrow0}\frac {f(x+\epsilon)-f(x)}{\epsilon} dxdf=ϵ→0limϵf(x+ϵ)−f(x)
而图像是一个二维函数f(x,y),其微分当然就是偏微分。因此有:
∂ f ( x , y ) ∂ x = lim ϵ → 0 f ( x + ϵ , y ) − f ( x , y ) ϵ ∂ f ( x , y ) ∂ y = lim ϵ → 0 f ( x , y + ϵ ) − f ( x , y ) ϵ \frac {\partial f(x,y)}{\partial x} = \lim_{\epsilon\rightarrow0}\frac {f(x+\epsilon, y)-f(x, y)}{\epsilon}\\ \frac {\partial f(x,y)}{\partial y} = \lim_{\epsilon\rightarrow0}\frac {f(x, y+\epsilon)-f(x, y)}{\epsilon} ∂x∂f(x,y)=ϵ→0limϵf(x+ϵ,y)−f(x,y)∂y∂f(x,y)=ϵ→0limϵf(x,y+ϵ)−f(x,y)
因为图像是一个离散的二维函数, ϵ \epsilon ϵ不能无限小,我们的图像是按照像素来离散的,最小的 ϵ \epsilon ϵ就是1像素。因此,上面的图像微分又变成了如下的形式( ϵ = 1 \epsilon=1 ϵ=1):
∂ f ( x , y ) ∂ x = f ( x + 1 , y ) − f ( x , y ) = g x ∂ f ( x , y ) ∂ y = f ( x , y + 1 ) − f ( x , y ) = g y \frac {\partial f(x,y)}{\partial x} = f(x+1,y)-f(x,y)=gx\\ \frac {\partial f(x,y)}{\partial y} = f(x,y+1)-f(x,y)=gy ∂x∂f(x,y)=f(x+1,y)−f(x,y)=gx∂y∂f(x,y)=f(x,y+1)−f(x,y)=gy
这分别是图像在(x, y)点处x方向和y方向上的梯度,从上面的表达式可以看出来,图像的梯度相当于2个相邻像素之间的差值。
梯度简单来说就是求导。OpenCV 提供了三种不同的梯度滤波器,或者说高通滤波器: S o b e l Sobel Sobel, S c h a r r Scharr Scharr 和 L a p l a c i a n 。 Laplacian。 Laplacian。什么叫高通呢?其实就是和图像模糊相反。图像模糊是让低频通过,阻挡高频,这样就可以去除噪点,让锐利的边缘变平滑。高通滤波器就是让高频通过,阻挡低频,可以让边缘更加明显,增强图像。
G x = [ − 1 0 + 1 − 2 0 + 2 − 1 0 + 1 ] ∗ A a n d G y = [ − 1 − 2 − 1 0 0 0 + 1 + 2 + 1 ] ∗ A G_x = \begin{bmatrix} -1 & 0 & +1 \\ -2 & 0 & +2 \\ -1 & 0 & +1 \end{bmatrix}*A \qquad and \qquad G_y = \begin{bmatrix}-1 & -2 & -1 \\ 0 & 0 & 0 \\ +1 & +2 & +1\end{bmatrix}*A Gx=⎣ ⎡−1−2−1000+1+2+1⎦ ⎤∗AandGy=⎣ ⎡−10+1−20+2−10+1⎦ ⎤∗A
S o b e l Sobel Sobel算子是高斯平滑和微分操作的结合体,所以他的抗噪声能力很好。该算子利用局部差分寻找边缘,计算所得的是一个梯度的近似值。可以设定求导的方向( X X X 或 Y Y Y)。还可以设定使用的卷积核大小( k s i z e ksize ksize)。当 k s i z e = − 1 ksize=-1 ksize=−1时,会使用 3 x 3 3x3 3x3 的 S c h a r r Scharr Scharr滤波器,他的效果要比 3 x 3 3x3 3x3的 S o b e l Sobel Sobel滤波器好,而且速度相同,所以在使用 3 x 3 3x3 3x3滤波器时应该尽量使用 S c h a r r Scharr Scharr滤波器(一般就用 S o b e l Sobel Sobel算子即可)。
前一个 S o b e l Sobel Sobel矩阵与原始图像A进行卷积操作后得到的是右边的像素值减去左边的像素值;后一个 S o b e l Sobel Sobel矩阵与原始图像A进行卷积操作后得到的是下边的像素值减去上边的像素值。
o p e n c v ( c + + )中的定义 opencv(c++)中的定义 opencv(c++)中的定义
void Sobel(cv::InputArray src, cv::OutputArray dst, int ddepth, int dx, int dy, int ksize = 3, double scale = (1.0), double delta = (0.0), int borderType = 4)
G x = [ − 3 0 + 3 − 10 0 + 10 − 3 0 + 3 ] ∗ A a n d G y = [ − 3 − 10 − 3 0 0 0 + 3 + 10 + 3 ] ∗ A G_x = \begin{bmatrix} -3 & 0 & +3 \\ -10 & 0 & +10 \\ -3 & 0 & +3 \end{bmatrix}*A \qquad and \qquad G_y = \begin{bmatrix}-3 & -10 & -3 \\ 0 & 0 & 0 \\ +3 & +10 & +3\end{bmatrix}*A Gx=⎣ ⎡−3−10−3000+3+10+3⎦ ⎤∗AandGy=⎣ ⎡−30+3−100+10−30+3⎦ ⎤∗A
其实就是将 S o b e l Sobel Sobel算子的数增大了,这样对边缘的检测更敏感。
o p e n c v ( c + + ) opencv(c++) opencv(c++)中的定义
void Scharr(cv::InputArray src, cv::OutputArray dst, int ddepth, int dx, int dy, double scale = (1.0), double delta = (0.0), int borderType = 4)
拉普拉斯算子:拉普拉斯算子(Laplace Operator)是n维欧几里德空间中的一个二阶微分算子,定义为梯度(▽f)的散度(▽·f)
△ f = ▽ 2 f = ▽ . ▽ f = ∑ i = 1 n ∂ 2 f ∂ x i 2 \vartriangle f = \triangledown^2 f=\triangledown . \triangledown f=\sum_{i=1}^n \frac {\partial^2 f}{\partial x^2_i} △f=▽2f=▽.▽f=i=1∑n∂xi2∂2f
在图像中
L a p l a c i a n Laplacian Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。
o p e n c v ( c + + ) opencv(c++) opencv(c++)中的定义
void cv::Laplacian(cv::InputArray src, cv::OutputArray dst, int ddepth, int ksize = 1, double scale = (1.0), double delta = (0.0), int borderType = 4)