Introduction to Computer Vision

4 minute read

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(AB) = \frac{P(A \cap B)}{P(B)}$$
  • 贝叶斯定理:$$P(AB) = \frac{P(BA)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算子的核函数是一个复杂的函数,包括高斯滤波、梯度计算、非极大值抑制和双阈值检测等步骤。

步骤:

  1. 灰度化图像
  2. 对图像进行高斯滤波
  3. 检测图像中的水平,垂直和对角边缘
  4. 对梯度幅值进行非极大值抑制
    • 非极大值抑制(Non-maximum Suppression, NMS)是一种用于目标检测算法中的后处理技术,主要用来清除多余的边界框(bounding boxes)。它并不仅仅是“取最大值”,而是通过一定的规则筛选出其中最具代表性的边界框
  5. 使用双阈值检测来检测边缘

最优边缘

  1. 好的检测: 算法能够检测到所有真实的边缘
  2. 好的定位:检测到的边缘与真实边缘尽可能接近
  3. 最小响应:每个真实边缘只能检测到一次

双目系统

  • 立体视觉
  • 视差

视差disparity

  • 视差是指同一物体在左右两个视网膜上的成像位置之间的差异
  • 距离越远,视差越小
  • \[Z = \frac{f \cdot T}{d}\]

Spin Image

  • 用于描述物体的三维形状
  • 是基于点云空间分布的最经典的特征描述子之一
  • 将一定区域的点云投影到一个二维的的spin image. 然后对场景和模型的spin images 进行相似性度量