跳转到内容
新建笔记

图像处理

adaptiveThreshold():自适应阀值

根据 OpenCV 中的 cv::adaptiveThreshold 函数的声明,以下是函数的参数说明:

void cv::adaptiveThreshold(
InputArray src, // 输入图像(灰度图像)
OutputArray dst, // 输出图像,用于存储阈值化结果
double maxValue, // 高于阈值时设置的像素值
int adaptiveMethod, // 自适应阈值方法,可以选择 ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C
int thresholdType, // 阈值类型,可以选择 THRESH_BINARY 或 THRESH_BINARY_INV
int blockSize, // 窗口大小,用于计算局部均值或高斯权重
double C // 从局部均值或加权局部均值中减去的常数
);

对这些参数的解释如下:

  • src: 输入图像,应该是灰度图像。
  • dst: 输出图像,用于存储阈值化结果。
  • maxValue: 高于阈值时设置的像素值。
  • adaptiveMethod: 自适应阈值方法,可以选择 ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C。
  • thresholdType: 阈值类型,可以选择 THRESH_BINARY 或 THRESH_BINARY_INV。
  • blockSize: 窗口大小,用于计算局部均值或高斯权重。通常设置为奇数,例如 3、5、7 等。
  • C: 从局部均值或加权局部均值中减去的常数。通常设置为正数。
  1. 如果窗口大小设置得太小,当标记的大小较大时,可能会导致“破坏”标记的边界,从而导致无法检测到标记。这是因为窗口太小可能无法适应较大的标记,导致部分标记被忽略,影响检测效果。

  2. 相反,如果窗口大小设置得太大,当标记的大小较小时,也可能产生相同的效果,并且还可能降低性能。此外,设置得太大的窗口会倾向于进行全局阈值处理,从而失去自适应阈值处理的优势。自适应阈值处理的优势在于根据局部图像特征动态调整阈值,以适应不同区域的光照变化和对比度变化。

  3. 对于 THRESH_BINARY 和 THRESH_BINARY_INV 的公式,使用 LaTeX 表示如下:

    • 对于 THRESH_BINARY:

      dst(x,y)={maxValue,if src(x,y)>T(x,y) 0,otherwise\text{dst}(x, y) = \begin{cases} \text{maxValue,} & \text{if } \text{src}(x, y) > T(x, y) \ 0, & \text{otherwise} \end{cases}
    • 对于 THRESH_BINARY_INV:

      dst(x,y)={0,if src(x,y)>T(x,y) maxValue,otherwise\text{dst}(x, y) = \begin{cases} 0, & \text{if } \text{src}(x, y) > T(x, y) \ \text{maxValue,} & \text{otherwise} \end{cases}

    其中,( T(x, y) ) 是基于所选自适应方法计算的每个像素的阈值。

    请注意,这些公式描述了根据像素值与相应阈值的关系设置目标图像的像素值。在这两种情况下,如果像素值大于阈值 ( T(x, y) ),则将设置为 maxValue,否则将设置为 0 或 maxValue。


无标题

仿射矩阵,单应性矩阵

单应性矩阵(Homography Matrix)是一种描述投影关系的矩阵,通常用于在不同视角或不同位置拍摄的图像之间的几何变换。对于二维平面上的点,单应性矩阵可以表示为 3x3 的矩阵。考虑从一个平面到另一个平面的投影,可以使用以下公式表示:

s[x′ y′ 1]=H[x y 1]s \begin{bmatrix} x' \ y' \ 1 \end{bmatrix} = H \begin{bmatrix} x \ y \ 1 \end{bmatrix}

其中,((x, y)) 是原始平面上的坐标,((x’, y’)) 是投影后的平面上的坐标,(H) 是 3x3 的单应性矩阵,(s) 是尺度因子。

在实际应用中,我们通常使用齐次坐标来表示点,上述公式可以改写为:

sp′=Hps \mathbf{p'} = H \mathbf{p}

其中,p=[x,y,1]T\mathbf{p} = [x, y, 1]^T是原始平面上的点的齐次坐标,p′=[x′,y′,1]T\mathbf{p'} = [x', y', 1]^T 是投影后的平面上的点的齐次坐标。

为了从这个公式中推导单应性矩阵 (H),我们可以将其分解为两个平面之间的投影关系。考虑两个平面之间的映射:

s[x′y′1]=[h11h12h13h21h22h23h31h32h33][xy1].s \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}.

这里的 hijh_{ij}是矩阵 (H) 的元素。

然后,我们可以得到以下方程:

sx′=h11x+h12y+h13 sx' = h_{11}x + h_{12}y + h_{13} sy′=h21x+h22y+h23sy' = h_{21}x + h_{22}y + h_{23} s=h31x+h32y+h33s = h_{31}x + h_{32}y + h_{33}

单应性矩阵只有相对尺度有意义,因此有 8 个自由度。当 h33≠0h_{33}\ne0 时,可以把整个矩阵除以 h33h_{33},令这一项为 1;不能把最后一行任意改成 (0,0,1)(0,0,1),那会额外限制为仿射变换。每个点对提供两个独立方程,至少需要 4 对处于非退化配置的对应点;四点情形下,两组点各自都不能有三点共线。更多带噪匹配通常结合稳健估计与后续优化处理。

OpenCV 的 cv2.getPerspectiveTransform() 接受四对点;cv2.findHomography() 可处理更多匹配并选择稳健估计方法。参见 OpenCV 单应性教程。