Introduction to Computer Vision
Published:
ML Math Fundamentals
向量
\(\overrightarrow{a}= (x, y)\)
向量计算
- 向量加法:\(\overrightarrow{a} + \overrightarrow{b} = (x_1 + x_2, y_1 + y_2)\)
- 向量数乘:\(k\overrightarrow{a} = (kx, ky)\)$$
- 向量点乘:\(\overrightarrow{a} \cdot \overrightarrow{b} = x_1x_2 + y_1y_2\)
向量模长:$$ \overrightarrow{a} = \sqrt{x^2 + y^2}$$ 向量夹角:$$\cos(\theta) = \frac{\overrightarrow{a} \cdot \overrightarrow{b}}{ \overrightarrow{a} \overrightarrow{b} }$$
性质
\(T(v+w) = T(v)\)
\(T(cv) = cT(v)\)
矩阵
\(A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}\) \(B = \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix}\)
矩阵计算
- 矩阵加法(行列数需要相同):\(A + B = \begin{bmatrix} 1+5 & 2+6 \\ 3+7 & 4+8 \end{bmatrix}\)
- 矩阵数乘:\(kA = \begin{bmatrix} k1 & k2 \\ k3 & k4 \end{bmatrix}\)
- 矩阵乘法(前一个列需要与后一个的行相同):\(AB = \begin{bmatrix} 1*5+2*7 & 1*6+2*8 \\ 3*5+4*7 & 3*6+4*8 \end{bmatrix}\) (不满足交换律)
结果行列数: (a,b) * (b,c) = (a,c) - 矩阵点乘:\(A \cdot B = \begin{bmatrix} 1*5 & 2*6 \\ 3*7 & 4*8 \end{bmatrix}\)
- 矩阵转置:\(A^T = \begin{bmatrix} 1 & 3 \\ 2 & 4 \end{bmatrix}\)
\((A^T)^T = A\)
\((AB)^T = B^T * A^T\) - 对称矩阵:\(A = A^T\)
\(A^TA\) 结果为对称矩阵
\(A = \begin{bmatrix} a & b \\ c & d \end{bmatrix}\)
矩阵行列式:$$ A = ad - bc$$ (对角线差) - 单位矩阵:\(I = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}\)
- 矩阵逆:\(A^{-1}A = I\)
条件:$$ A \neq 0$$ $$A^{-1} = \frac{1}{ A }\begin{bmatrix} d & -b \ -c & a \end{bmatrix}$$ 欧氏变换: \(a'= Ra+t\) (R为旋转矩阵,t为平移向量. 形式需要一致)
- 齐次坐标: 一个点的坐标为(x,y), 齐次坐标为(x1,y1,w). x1 = x/w, y1 = y/w
导数
- 导数定义:\(f'(x) = \lim_{h \to 0} \frac{f(x+h) - f(x)}{h}\)
- 求导法则:
- \[f(x) = k, f'(x) = 0\]
- \[f(x) = x^n, f'(x) = nx^{n-1}\]
- \[f(x) = e^x, f'(x) = e^x\]
- \[f(x) = \ln(x), f'(x) = \frac{1}{x}\]
- \[f(x) = \sin(x), f'(x) = \cos(x)\]
- \[f(x) = \cos(x), f'(x) = -\sin(x)\]
- \[f(x) = \tan(x), f'(x) = \sec^2(x)\]
- 链式法则:\(f(g(x))' = f'(g(x))g'(x)\)
- 偏导数:\(f(x, y) = x^2 + y^2, \frac{\partial f}{\partial x} = 2x, \frac{\partial f}{\partial y} = 2y\)
梯度:\(\nabla f = \begin{bmatrix} \frac{\partial f}{\partial x} \\ \frac{\partial f}{\partial y} \end{bmatrix}\)
- 梯度下降:\(x_{n+1} = x_n - \alpha \nabla f(x_n)\)
概率
- 概率定义:\(P(A) = \frac{N(A)}{N(S)}\)
- 互斥事件:\(P(A \cup B) = P(A) + P(B)\)
- 独立事件:\(P(A \cap B) = P(A)P(B)\)
- P(A-B) = P(A) - P(AB)
条件概率:$$P(A B) = \frac{P(A \cap B)}{P(B)}$$ 贝叶斯定理:$$P(A B) = \frac{P(B A)P(A)}{P(B)}$$ - 期望:\(E(X) = \sum_{i=1}^{n} x_iP(x_i)\)
- 方差:\(Var(X) = E(X^2) - E(X)^2\)
- 正太分布:\(f(x) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}}\)
熵
- 熵定义:\(H(X) = -\sum_{i=1}^{n} P(x_i)\log_2P(x_i)\)
- 交叉熵:\(H(p, q) = -\sum_{i=1}^{n} p(x_i)\log_2q(x_i)\)
KL散度:$$D_{KL}(p q) = \sum_{i=1}^{n} p(x_i)\log_2\frac{p(x_i)}{q(x_i)}$$
RGB
- RGB颜色模型:\(RGB = (R, G, B)\)
- RGB颜色混合:\(C = \alpha A + (1-\alpha)B\)
- 二值图像:黑白图像,像素值为0或1
- 灰度图 像素由0-255表示,黑色为0,白色为255
- 彩色图 像素由RGB表示,黑色为(0,0,0),白色为(255,255,255)
- RGB转灰度:
- Float: \(Gray = 0.299R + 0.587G + 0.114B\)
- Int: \(Gray = (R30 + G59 + B11) / 100\)
- openCV读取图像的排练通道为BGR
图像
- up-sampling: 放大图像
- down-sampling: 缩小图像
- 最近邻插值:取最近的像素值
- 缩小:取周围4个像素的平均值
- 放大:取周围4个像素最近像素的值
- 双线性插值:取周围4个像素的加权平均
- 双三次插值:取周围16个像素的加权平均
- 最近邻插值:取最近的像素值
中心对齐: \(SrcX + 0.5 = (dstX+0.5)*(srcW/dstW)\) \(SrcY+0.5 = (dstY+0.5)*(srcH/dstH)\)
- 单线插值公式:\(f(x) = \frac{x_1-x}{x_1-x_0}y_0 + \frac{x-x_0}{x_1-x_0}y_1\)
双线性插值:就是求三次单线插值。在两个x方向上求两个点的插值,然后在y方向上求两个点的插值
- 直方图均衡化:将图像的灰度值均匀分布
- 公式:\(q = \sum_{k=0}^{p} \frac{hist_{input}(k)}{H*W} * 256 -1\)
卷积
- 卷积定义:\(f(x) * g(x) = \int_{-\infty}^{\infty} f(\tau)g(x-\tau)d\tau\)
- 卷积核(过滤器):\(K = \begin{bmatrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \end{bmatrix}\)
- 一种卷积核代表一种图像模式 (例如找到图像的横向或纵向边缘)
- 特征提取
- 平滑均值滤波:\(K = \frac{1}{9}\begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix}\)
- 去除噪声, 但是会使图像变模糊
- 高斯滤波:\(K = \frac{1}{16}\begin{bmatrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{bmatrix}\)
- 去除噪声,保留图像边缘
- 边缘检测:\(K = \begin{bmatrix} -1 & -1 & -1 \\ -1 & 8 & -1 \\ -1 & -1 & -1 \end{bmatrix}\)
- sobel 边缘检测:\(K = \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix}\)(水平边缘)
- 步长(stride):卷积核每次移动的距离
- 填充(padding):在原图像周围填充0,使得卷积后图像大小不变
相机模型
坐标变换
- 世界坐标系:\(P_w = (X_w, Y_w, Z_w)\)
- 相机坐标系:\(P_c = (X_c, Y_c, Z_c)\)
- 相机内参:\(K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}\)
- 相机外参:[R|t]
世界坐标系转像素坐标系:P_{uv} = K[R|t]P_w
- 世界坐标 ->(欧氏变换) 相机坐标 ->(相似三角形) 成像平面 ->(距离转变为像素) 像素坐标
畸变
径向畸变:\(r = \sqrt{x^2 + y^2}\)
\(x_{corrected} = x(1 + k_1r^2 + k_2r^4 + k_3r^6)\)
\(y_{corrected} = y(1 + k_1r^2 + k_2r^4 + k_3r^6)\)切向畸变:\(x_{corrected} = x + [2p_1xy + p_2(r^2 + 2x^2)]\)
透视变换
- 给4组已知点,求透视变换矩阵
图像锐化
图像锐化是一种图像增强技术,它可以使图像中的边缘和纹理更加清晰,从而提高图像的质量。图像锐化的基本原理是通过增强图像中的高频信息,使图像中的边缘和纹理更加明显。图像锐化的方法有很多种,常用的方法有拉普拉斯算子、Sobel算子、Prewitt算子等。
拉普拉斯算子
核函数: \(\begin{bmatrix} -1 & -1 & -1 \\ -1 & 4 & -1 \\ -1 & -1 & -1 \end{bmatrix}\) 拉普拉斯算子是一种常用的图像锐化算子,它可以增强图像中的高频信息,使图像中的边缘和纹理更加明显。拉普拉斯算子的核函数是一个3x3的矩阵,中间的元素是比较大数字,周围的元素是-1或者小的数字,可以通过卷积运算来实现图像的锐化。
Sobel算子
sobel 是两个核函数,一个用于计算水平方向的梯度,一个用于计算垂直方向的梯度。通过计算两个方向的梯度,可以得到图像中每个像素点的梯度大小和方向。sobel算子可以用于边缘检测和图像锐化。
Prewitt算子
prewitt算子是sobel算子的变种。prewitt算子也是两个核函数,一个用于计算水平方向的梯度,一个用于计算垂直方向的梯度。prewitt算子和sobel算子的区别在于核函数的不同,prewitt算子的核函数是: \(\begin{bmatrix} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \end{bmatrix}\)
Canny算子
canny算子是一种常用的边缘检测算子,它可以检测图像中的边缘,并且可以消除噪声。canny算子的核函数是一个5x5的矩阵,可以通过卷积运算来实现边缘检测。canny算子的核函数是一个复杂的函数,包括高斯滤波、梯度计算、非极大值抑制和双阈值检测等步骤。
步骤:
- 灰度化图像
- 对图像进行高斯滤波
- 检测图像中的水平,垂直和对角边缘
- 对梯度幅值进行非极大值抑制
- 非极大值抑制(Non-maximum Suppression, NMS)是一种用于目标检测算法中的后处理技术,主要用来清除多余的边界框(bounding boxes)。它并不仅仅是“取最大值”,而是通过一定的规则筛选出其中最具代表性的边界框
- 使用双阈值检测来检测边缘
最优边缘
- 好的检测: 算法能够检测到所有真实的边缘
- 好的定位:检测到的边缘与真实边缘尽可能接近
- 最小响应:每个真实边缘只能检测到一次
双目系统
- 立体视觉
- 视差
视差disparity
- 视差是指同一物体在左右两个视网膜上的成像位置之间的差异
- 距离越远,视差越小
- \[Z = \frac{f \cdot T}{d}\]
Spin Image
- 用于描述物体的三维形状
- 是基于点云空间分布的最经典的特征描述子之一
- 将一定区域的点云投影到一个二维的的spin image. 然后对场景和模型的spin images 进行相似性度量