15.指数-导数与微分-2阶指数-矢量-归一化-欧几里得-对数-象限(数学篇)—OpenCV从零开始到图像(人脸 + 物体)识别系列
本文作者:小嗷
微信公众号:aoxiaoji
简书链接:https://www.jianshu.com/u/45da1fbce7d0
2.1 指数
指数是幂运算aⁿ(a≠0)中的一个参数,a为底数,n为指数,指数位于底数的右上角,幂运算表示指数个底数相乘。当n是一个正整数,aⁿ表示n个a连乘。当n=0时,aⁿ=1。
指数的API函数:exp - 第138页(opencv2refman.pdf)
大概意思就是计算每个数组元素的指数。
用途:伽马变换可以根据γ值的不同来选择性的增强低灰度或者高灰度区域的对比度。
gamma变换。Gamma变换有常被称为指数变换或幂变换,是一种常用的非线性变换。它的变换函数如下
Y = (X + esp)γ
伽马变换可以的话,今天写完。不可以就下次写
2.2 导数与微分
导数平面(1元)图上,我们可以理解为斜率,切线。3维(2元)就是我们的世界,就是一个切面.
就说最简单的一元情况下,导数是一个确定的数值,几何意义是切线斜率,物理意义是瞬时速度。而微分是一个函数表达式,用于自变量产生微小变化时计算因变量的近似值。
下面导数字段转载自知乎:马同学(小嗷在他基础上改改加加)
先简短地回答下我对“什么是导数”的认识:导数是用来找到“线性近似”的数学工具。
下面我来解释一下,为什么我是这样认为的。
在我学习微积分的过程中,我对导数的认知经历了三次变化:
- 导数是变化率、是切线的斜率、是速度、是加速度
- 导数是用来找到“线性近似”的数学工具
- 导数是线性变换
我认为第一种认知比较片面,在多元函数的情况下甚至是错误的。第二种认知更接近微积分的本质,第三种认知是为了实现第二种认知发展出来的。
因为种种原因,我们的学习都是从第一种认知开始的。我会在本文分别介绍一下这三种认知。最后会通过第三种认知回答“多元微积分中,可微函数的切线为什么会共面(此平面即切平面)?”
1 导数是变化率、是切线的斜率、是速度、是加速度
因为牛顿研究物理的缘故,所以牛顿用变化率的方式引入了导数(牛顿称之为“流数”)。
在物理里面变化率还是很自然的概念,比如为了求瞬时速度:
我们一般是上面这样的学习过程,所以我们认为,导数是曲线的变化率、是瞬时速度、是加速度,还可以是切线的斜率。
简单函数
把导数看作是变化率、是切线的斜率,在一元函数的时候是正确的。二元变化就不一样。
在二元函数中,比如这样一个曲面上的一点a:
在曲面上可以做无数条过a点的曲线(图上随便画了三根):
把导数看作是变化率、是切线的斜率,在多元函数中是片面的,甚至是不正确的。
我们必须要重新审视“导数是什么”这个问题。
2 导数是用来找到“线性近似”的数学工具
讲这个之前,我们要先理解微积分的基本思想。这个思想在我的很多回答中都提到了,这里简单的阐述下。
2.1 微积分的基本思想
微积分的基本思想是“以直代曲”:
“以直代曲”的意思就是,切线可以在切点附近很好的近似曲线:
我觉得下面这幅图也挺有意思,如果在曲线上多选几个点,都作出附近的切线,我们可以透过切线看到曲线的轮廓:
这里我希望给你一个直观印象,切线可以在切点附近很好的近似曲线。如果仔细看泰勒公式、洛必达法则等,还会通过代数发现这一事实。(泰勒公式、洛必达法则,往后图像识别会用到)
2.2 导数是用来找到“线性近似”的数学工具
因为“以直代曲”是微积分的基础,所以我们首要任务就是要找到这个“直”,也就是切线,也就是所谓的“线性近似”。导数就是为了完成这个任务需要使用的数学工具。
我们来看看,在一元函数中:
因此,在一元函数中,我们把导数看作斜率,可以找到我们想要的“线性近似”(切线),但是在二元中,我们需要新的技术手段。
3 导数是线性变换
3.1 二元函数的“线性近似”
导数最主要的目的是找到“线性近似”,在一元函数的时候是要找到切线,在二元函数的时候是要找到一个切平面
一个平面是没有斜率的概念的,因此我们不能把导数继续看作斜率了,我们需要别的方法来找到这个切平面。
3.2 线性变换
对线性代数不熟悉的话,可以先看下我之前的回答 什么是仿射变换? 。下面就会用到大量的线性代数基础知识,我不再进行解释了。
(线性代数,我先拿个本本记住,以后再说。以后,会有一篇专门讲仿射变换。)
等不及的小伙伴,其实可以自行看
麻省理工公开课:线性代数一共35集
http://open.163.com/special/opencourse/daishu.html
如马尔可夫矩阵;.傅立叶级数 ,如:马尔可夫,在深度学习中,即AI,有个关于马尔可夫链的东东,慢慢来吧,我们一起一层一层皮剥开它。有机会,我在写个麻省理工公开课的每一集读后感
外国老师讲课的厉害在于让你能听懂让你觉得自己挺有希望的,中国老师讲课的厉害在于让你听不懂然后开始怀疑自己的智商问题。
还是从一元的时候开始推:
(向量也是建议开公开课)
上图的指向右边,实际上求出的A是右导数,我换个方向就可以求出左导数:
如果A=B,相当于左右导数相等,我们就称为此点可导。
顺便说一句,此时在 a 点附近同样也有。
二元函数的时候,有无数的方向(不像一元的时候只有左右两边):
我们把这些分别记为 ,那它们的切线分别为:
导数分别就是 (可以理解这些都是方向导数)。
导数:如果有那么此点可导,此点导数即为A。
为什么A就是导数?A不是还没有完成找到切平面的任务吗?
3.3 通过导数A来找到切平面
首先,所有的肯定是共面的:
因为此点可导,即所有的的导数都是A,所以变换后的结果也共面(线性变换的特点是,变换前是共面的,变换后也是共面的):
看看吧(可以旋转视角来观察):
对所有的的都进行 A 变换,实际上就得到了切平面:
至此,导数完成了找到“线性近似”的任务。这里也很自然的回答了“多元微积分中,可微函数的切线为什么会共面(此平面即切平面)?”
注意,有一点需要特别说明的是,因为矢量的起始点要求是在原点,但是我上面把起始点放在a点了,所以实际上是仿射变化,所以实际上,A 仍然是导数。
用途:仿射变换
(导数、向量、微分以后会经常用到。导数平面(1元)图上,我们可以理解为斜率,切线。3维(2元)就是我们的世界,就是一个切面.)
2.3 二阶指数
一阶导数的导数称为二阶导数,就是导数再求导数
简单函数
2.4 矢量,即向量
矢量(vector)是一种既有大小又有方向的量,又称为向量。一般来说,在物理学中称作矢量,例如速度、加速度、力等等就是这样的量。舍弃实际含义,就抽象为数学中的概念──向量。在计算机中,矢量图可以无限放大永不变形。
具体请转移到
http://open.163.com/special/opencourse/daishu.html
2.5 归一化
归一化就是把要处理的量都缩放到一个范围。即:规范化数组的规范或值范围。
归一化处理很简单,假设原图像是8位灰度图像,那么读入的像素矩阵最大值为256,最小值为1
定义矩阵为I ,J=I/256,就是归一化的图像矩阵,就是说归一化之后所有的像素值都在[0,1]区间内 。opencv里有专门的函数做归一化处理
2.6 normalize(归一化)
- 函数原型:void cv::normalize(InputArry src,InputOutputArray dst,double alpha=1,double beta=0,int norm_type=NORM_L2,int dtype=-1,InputArray mark=noArry())
函数作用
归一化数据。该函数分为范围归一化与数据值归一化。(Normalizes the norm or value range of an array.)参数说明
src 输入数组; dst 输出数组,数组的大小和原数组一致; alpha 1,用来规范值,2.规范范围,并且是下限; beta 只用来规范范围并且是上限; norm_type 归一化选择的数学公式类型; dtype 当为负,输出在大小深度通道数都等于输入,当为正,输出只在深度与输如不同,不同的地方游dtype决定; mark 掩码。选择感兴趣区域,选定后只能对该区域进行操作。
归一化选择的数学公式类型介绍(norm_type)
设数组中原有{A1,A2,A3…An}
NORM_L1:
NORM_INF:
NORM_L2:
NORM_MINMAX:(AK不属于{max(Ai)},min(Ai),当AK等于max(Ai)时p=1,等于min(Ai)时p=0)
5.举例说明:
src={10,23,71}
NORM_L1运算后得到 dst={0.096,0.221,0.683}
NORM_INF运算后得到 dst={0.141,0.324,1}
NORM_L2运算后得到 dst={0.133,0.307,0.947}
NORM_MINMAX运算得到 dst={0,0.377,1}
6.范围归一化与值归一化的区别
区别一:范围归一化使用的是如下式子,设范围为【0,255】
即把src缩放到【0,255】这个范围内,并不使用上面的4个公式去解。
区别二:使用范围归一化时,beta必有值不等于0
举例说明:
一 值归一化:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
int main()
{
vector<double>a={ 10,11,234,45,65,456,0 };
cv::normalize(a, a, 1,0, cv::NORM_MINMAX);
for (int i=0;i < a.size();i++)
{
cout << a[i] << endl;
}
return 0;
}
结果如下:
二 范围归一化
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
int main()
{
vector<double>a={ 10,11,234,45,65,456,0 };
cv::normalize(a, a, 0,255, cv::NORM_MINMAX);
for (int i=0;i < a.size();i++)
{
cout << a[i] << endl;
}
return 0;
}
结果如下:
查opencv2refman.pdf第151页
(加公众号输入opencv2refman.pdf,自动跳出百度分享,或者上几篇文章,有写地址)
2.7 欧几里得之欧氏距离
欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。
二维空间的公式:
三维空间的公式:
n维空间的公式
n维欧氏空间是一个点集,它的每个点 X 或向量 x 可以表示为 (x[1],x[2],…,x[n]) ,其中 x[i](i = 1,2,…,n) 是实数,称为 X 的第i个坐标。
两个点 A = (a[1],a[2],…,a[n]) 和 B = (b[1],b[2],…,b[n]) 之间的距离 ρ(A,B) 定义为下面的公式:
ρ(A,B) =√ [ ∑( a[i] - b[i] )^2 ] (i = 1,2,…,n)
向量 x = (x[1],x[2],…,x[n]) 的自然长度 |x| 定义为下面的公式:
|x| = √( x[1]^2 + x[2]^2 + … + x[n]^2 )
2.8 什么是欧几里得几何学?
研究直线和二次曲线(即圆锥曲线, 就是椭圆、双曲线和抛物线)的几何结构和度量性质(面积、长度、角度)。理解为主,以后大把机会用到
http://open.163.com/special/Khan/euclideangeometry.html
用途:两个特征向量之间的欧氏距离,越小表明匹配度越高。
2.9 对数
在数学中,对数是对求幂的逆运算,正如除法是乘法的倒数,反之亦然。 这意味着一个数字的对数是必须产生另一个固定数字(基数)的指数。 在简单的情况下,乘数中的对数计数因子。更一般来说,乘幂允许将任何正实数提高到任何实际功率,总是产生正的结果,因此可以对于b不等于1的任何两个正实数b和x计算对数。
如果a的x次方等于N(a>0,且a不等于1),那么数x叫做以a为底N的对数(logarithm),记作x=logaN。其中,a叫做对数的底数,N叫做真数。
2.10 象限
象限(Quadrant)是平面直角坐标系(笛卡尔坐标系)中里的横轴和纵轴所划分的四个区域,每一个区域叫做一个象限。象限以原点为中心,x,y轴为分界线。右上的称为第一象限,左上的称为第二象限,左下的称为第三象限,右下的称为第四象限。坐标轴上的点不属于任何象限。
- 本人是抱着玩一玩的心态,学习opencv(其实深度学习没有外界说的这么高深,小嗷是白板,而且有工作在身并且于代码无关)
- 大家可以把我的数学水平想象成初中水平,毕竟小嗷既不是代码靠吃饭又不是靠数学吃饭,毕业N年
- 写文章主要是为了后人少走点弯路,多交点朋友,一起学习
- 如果有好的图像识别群拉我进去QQ:631821577
- 就我一个白板,最后还是成的,你们别怕,慢慢来把
分享可以无数次,转载成自己文章QQ邮箱通知一下,未经授权请勿转载。
- 邮箱:631821577@qq.com
- QQ群:736854977
- 有什么疑问公众号提问,下班或者周六日回答,ths
我当初学到傅里叶的时候,就知道下面是深坑。小嗷蹲在坑上,手里拿着一根薯条,看看坑下的无底洞,沉思一阵子正想转身离开。结果,脚滑了掉进去….
最后,数学还是要学习一下。如果想走这条路。
推荐文章:
14.图像增强与图像去噪,图像分割之边缘检测(傅里叶变换)— OpenCV从零开始到图像(人脸 + 物体)识别系列