梯度的清晰认识(从理解到应用)

1.梯度是什么?

1.1首先,说人话:

梯度是矢量,既有大小、又有方向:

  • 大小是立足于函数中你选取的某点,在该点下指向各个方向(四面八方),选取的变化最大的方向下的那个值
  • 方向就是该点处取变换最大值时的那个方向
  • 变化大指的是,函数上某点的位置朝某方向稍微偏移一点,该函数值能突然变大或变小很多
1.2准官方定义(图个乐)

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快变化率最大(为该梯度的模)。

友情提示:

  • 方向导数本质上研究的是函数在某点处沿某特定方向上的变化率问题(也就是说,构建方向导数需要两个元素:函数、指定方向)
  • 梯度反映的是空间变量变化趋势的最大值和方向。
1.3直观理解

可以看下这个动画视频

下面对视频做一个简析:

1.3.1.图示函数:Z=F(X,Y)

在这里插入图片描述

1.3.2.固定一轴,移动一轴

我们固定住X值(X坐标位置不变),变化Y的值(红球在黑线上的位置),Y变了(红球在黑线上移动),Z值也随之改变(红球高度在变化):在这里插入图片描述

1.3.3.斜率

在每个点上,函数Z的变化值(红球的高度变化),除以Y的变化值(红球在黑线上 水平 位移变化),就是此线的斜率(如图所示):在这里插入图片描述在这里插入图片描述在这里插入图片描述

1.3.4.偏导数

Z的增量,除以Y的增量,就是Z对于Y的偏导数:
在这里插入图片描述好的,此处又来了一个偏导数的概念,偏导数是什么呢?

  • 我将偏导数理解为方向导数的特例
  • 偏导数是沿坐标轴方向的方向导数
  • 偏导数必须要满足求导点的左右导数相等
  • 这里举个有方向导数、但不是偏导数的特例在这里插入图片描述
  • 1.3.5.颜色映射

①在刚才X轴不动,移动Y轴求Z在y的偏导后,我们将偏导数的最大值设为深蓝,将最小值(负最大值)设为深红,按比例进行颜色映射:
在这里插入图片描述

②现在同理,求Y不变、X变化时,也就是Z对于X的偏导的颜色映射:

在这里插入图片描述

1.3.6 叠加得到Z函数的梯度

在正常的点上,就会有Z在x上的偏导和Z在y上的偏导:在这里插入图片描述对其叠加:
在这里插入图片描述得到一个新的箭头,这个有长度和方向的箭头,就是Z函数在该点的梯度:
它总是指向Z函数增长最大的方向
在这里插入图片描述

1.4举个栗子

下山问题(原作者key):
在这里插入图片描述
上图可以看做是一座山的模型,我们处在山上的某一点处,需要走到山下。

  • 理论上来说,这座山的表面是可以通过一个函数的描述的(虽然想要找到这个函数可能很难)
  • 而这个函数可以在不同的方向上都确定出一个方向导数,这就好比于如果我们想下山,道路并不是唯一的,而是可以沿任何方向移动。

区别在于(在这里,速度的值就是方向导数的直观理解):

  • 有些方向可以让我们下山速度更快
  • 有些方向让我们下山速度更慢
  • 有些方向甚至引导我们往山顶走(也可以理解为下山速度时负的)。

2.梯度公式推导

公式直接上百度
有位博主从泰勒级数的角度,理解梯度,值得一康

3.图像梯度

参考、节选自该文

3.1给菜鸟的预知识

微分在数学中的定义:

  • 由函数B=f(A),得到A、B两个数集,在A中当dx靠近自己时,函数在dx处的极限叫作函数在dx处的微分

微分的几何意义:

  • 设Δx是曲线y = f(x)上的点M的在横坐标上的增量
  • Δy是曲线在点M对应Δx在纵坐标上的增量
  • dy是曲线在点M的切线对应Δx在纵坐标上的增量。
  • 当|Δx|很小时,|Δy-dy|比|Δx|要小得多(高阶无穷小)
  • 因此在点M附近,我们可以用切线段来近似代替曲线段。

微分和导数的区别:
①通俗版

  • 导数是曲线在那个点的切线斜率,而微分是那个切线的一元线性方程。
  • 微分的几何意义是用局部切线段近似代替曲线段,即非线性函数局部线性化

②专业版

  • 微分和导数是两个不同的映射。他们的定义域都是可微函数,微分的值域是1-form,导数的值域是函数。
  • 1-form(协变矢量或对偶矢量)就是形如 f(x)dx 的东西,函数就是形如 f(x) 的东西。
3.2像素级的图像梯度

图像是一个二维函数f(x,y),其微分当然就是偏微分。因此有:在这里插入图片描述
因为图像是一个离散的二维函数,ϵ不能无限小,我们的图像是按照像素来离散的,最小的ϵ就是1像素。因此,上面的图像微分又变成了如下的形式(ϵ=1):在这里插入图片描述
这分别是图像在(x, y)点处x方向和y方向上的梯度,从上面的表达式可以看出来,图像的梯度相当于2个相邻像素之间的差值。

3.3一个栗子–梯度增强图像的清晰度

只考虑x方向,选取某个像素:

  • 假设其像素值是100
  • 沿x方向的相邻像素分别是90,90,90
  • 则根据上面的计算其x方向梯度分别是10,0,0(最小微分单位就是1像素)
  • 这里只取变化率的绝对值,表明变化的大小。
    -在这里插入图片描述

这样一个像素图片,是不够清晰的:

  • 100和相邻的90之间亮度仅相差10,区别不大
  • 周遭一串的连续灰度值都是90,轮廓必然是模糊的。

注意最小微分单位为1像素的特性:

  • 如果相邻像素灰度值有变化,那么梯度就有值
  • 如果相邻像素灰度值没有变化,那么梯度就为0

利用该特性,如果我们把梯度值与对应的像素相加:

  • 那么灰度值没有变化的,像素值不变
  • 而有梯度值的,灰度值变大了
  • 这不正是我们期望的加强轮廓(边界)嘛?在这里插入图片描述

我们看到,相加后的新图像,原图像像素点100与90亮度只相差10,现在是110与90,亮度相差20了,对比度显然增强了,尤其是图像中物体的轮廓和边缘,与背景大大加强了区别,这就是用梯度来增强图像的原理。

拓展到二维:
x方向和y方向上的梯度可以用如下式子表示在一起: 在这里插入图片描述这里又是平方,又是开方的,计算量比较大,于是一般用绝对值来近似平方和平方根的操作,来降低计算量:在这里插入图片描述
我们来计算一下月球图像的x方向和y方向结合的梯度图像,以及最后的增强图像。(原图像来自冈萨雷斯的《数字图像处理》一书。)

import cv2
import numpy as np

moon = cv2.imread("moon.tif", 0)
row, column = moon.shape
moon_f = np.copy(moon)
moon_f = moon_f.astype("float")

gradient = np.zeros((row, column))

for x in range(row - 1):
    for y in range(column - 1):
        gx = abs(moon_f[x + 1, y] - moon_f[x, y])
        gy = abs(moon_f[x, y + 1] - moon_f[x, y])
        gradient[x, y] = gx + gy

sharp = moon_f + gradient
sharp = np.where(sharp < 0, 0, np.where(sharp > 255, 255, sharp))

gradient = gradient.astype("uint8")
sharp = sharp.astype("uint8")
cv2.imshow("moon", moon)
cv2.imshow("gradient", gradient)
cv2.imshow("sharp", sharp)
cv2.waitKey()

在这里插入图片描述

4.梯度算法

4.1高通和低通滤波

低通滤波(Low-pass filter) 是一种过滤方式,规则为低频信号能正常通过,而超过设定临界值的高频信号则被阻隔、减弱。

  • 图像模糊是让低频通过,阻挡高频,这样就可以去除噪点,让锐利的边缘变平滑。

高通滤波反之。

  • 高通滤波器就是让高频通过,阻挡低频,可以让边缘更加明显,增强图像。
4.2OpenCV中常用的三种梯度滤波器

梯度滤波器可以理解为高通滤波:

  • Sobel和Scharr算子:

  • 在这里插入图片描述

  • Laplacian算子:

  • 在这里插入图片描述
    例图:
    在这里插入图片描述

手撕算法

待填坑

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值