交比不变性:射影几何核心原理与计算机视觉应用实践
发布时间:2026/10/1 9:11:41来源:尧图网络
交比不变性是个很奇妙的话题。我在做相机标定项目时需要从不同角度拍摄的棋盘格图像中恢复角点的精确位置当时就靠这个性质绕开了大量计算。它属于射影几何的基础结论却在计算机视觉、图像配准、3D重建这些偏工程的领域里经常露脸。这篇文章我就把这个定理的来龙去脉、证明思路和实操时的注意点一次讲清楚尽量让不同基础的读者都能看懂、用上。1. 从一条直线上四个点说起交比到底是什么1.1 比值的比值交比的直观理解从最朴素的场景开始。想象一条直线上依次排列着 A、B、C、D 四个点。如果只看其中三个点比如 A、B、C我们可以定义两个线段的比值AC / BC这个比值描述的是 C 点在 A、B 之间的大致位置。但它有一个问题如果这条直线发生了透视变换比如你用相机从侧面拍它线段长度的比例会改变AC/BC 这个值往往就不一样了。于是射影几何里引入了一个更“强壮”的量叫做交比。它把四个点分成两组取两个比值再相除(AC / BC) / (AD / BD)这个值有一个了不起的性质无论你用什么样的中心投影、透视变换只要不把点投射到无穷远这四个点的交比都保持不变。换句话说交比就是射影变换下的不变量。那为什么把直线上的点和实际图像中的像素点联系起来就需要这个不变量因为真实相机拍摄的过程本质上就是一次中心投影我们看到的图像是三维世界在二维平面上的透视像。在这个过程中长度、角度、平行关系都可能被破坏但交比不会。这就是它在视觉测量中的价值所在。1.2 用坐标定义交比从坐标角度看交比可以写得更严谨。假设直线上四个点的坐标为 x₁、x₂、x₃、x₄无论它们所在的直线是一维坐标轴还是更高维空间中的任意一条直线只要取这条直线上的仿射坐标即可交比定义为(x₁, x₂; x₃, x₄) [(x₁ - x₃)(x₂ - x₄)] / [(x₁ - x₄)(x₂ - x₃)]注意这里减法的顺序是有讲究的。不同教材可能采用不同的符号约定但核心思想一致用四个点的有序对构造一个比值让它具有射影不变性。我在后面的证明中采用的就是这个定义后续推导会都基于它避免符号混乱。提示实际应用时选用哪种符号约定不重要重要的是整个推导过程自洽。建议固定一种写法不要中途更换否则很容易在数值验证时出现“明明用了交比结果却变了”的假象。如果用向量的观点来看交比还可以表达成有向线段的形式。这也是三维空间里更常见的表示(A, B; C, D) (AC/BC) / (AD/BD)这里的 AC、BC 等表示有向线段的长度。有向的含义是在直线上指定一个正方向后线段的长度带正负号。这个“符号”在后面的证明中也很关键它保证点交换顺序时交比的取值有规律可循。1.3 为什么偏偏是四个点而不是三个点这是我在和人交流时经常被问到的问题也是初学者最容易卡住的地方。答案要从投影变换的自由度说起。一维射影变换也就是直线到直线的投影对应一共有三个自由度。三个点恰好能确定一个一维射影变换也就是说你可以在一条直线上任取三个点找到唯一的投影变换把它们映射到另一条直线上的任意三个点。这样一来仅仅用三个点构造的任何量都不可能保持不变因为三个点本身就完全确定了变换变换一变所有基于三个点计算的值都跟着变。但四个点的情况就不同了。多了一个约束三个自由度全部用来匹配前三个点之后第四个点的位置就不能随意选了它被交比锁死。换句话说交比是一维射影变换下的“唯一基本不变量”你需要四个点才能捕捉到这个不变量。从本质上讲三个点描述一条直线上的位置关系时只是一个相对概念完全依赖坐标系的选取。四个点定义的交比则消去了坐标系和投影带来的影响是几何对象自身的内禀属性。注意这里的“自由度”是理解射影几何的关键。以后你在看单应矩阵、基础矩阵时都会反复遇到“几个点确定几个自由度”的思考方式。交比的学习正是这种思维的好起点。2. 透视投影与交比不变性的直觉铺垫2.1 中心投影从三维世界到照片的一次几何映射交比不变性的核心场景是中心投影。中心投影的定义很直白有一个投影中心 O、一个投影平面 Π空间中任意一点 P 的像就是直线 OP 与平面 Π 的交点。拿相机来类比更直观O 是相机光心Π 是成像平面空间物体通过光心投影到平面上形成照片。这是三维世界到二维图像的基本建模方式。在中心投影下原本平行的直线可能会相交比如铁轨在远处汇聚原本垂直的关系可能变成斜交原本相等的长度可能变得长短不一。这个时候如果你只是在一条被投影的直线上取两个点用它们的距离来估算空间距离结果一定是不可靠的。但如果取四个点计算交比这个值就和在空间直线上计算出来的完全一致。这就是交比不变性的直觉承诺它在投影过程中保持稳定。2.2 为什么要证明而不是直接接受可能有人觉得既然教材都写了交比不变性直接用不就行了为什么还要亲自证明一遍我的体会是证明的价值不在于把定理“固定”下来而在于从证明过程中你才能真正理解每个条件的角色。比如在证明过程中你会在某个环节用到“三角形相似”或者“面积比相等”这个环节恰恰揭示了交比为什么能抵消投影造成的畸变。你会看到投影带来的是一个“乘法因子”而交比的比值结构让这个乘法因子在分子分母中自动约掉。这个直觉比“交比不变性”这六个字有用得多。此外在实际工程中我们很多时候不是验证交比不变性而是利用它反推几何量。比如已知空间三点和对应图像三点求第四条线上点的位置或者反过来从图像中恢复一维测量值。这时候你必须知道交比在哪个坐标系下计算、用什么公式、顺序怎么排这些都要靠你对证明过程的深刻理解来支撑。2.3 交比在射影变换中的“保底”作用射影变换比刚体变换和仿射变换更“自由”它允许平行线变成相交线。面对这么自由的变换似乎很难找到不变的东西。但射影几何告诉我们交比就是那个不变的东西。这个“保底”作用反映在实际应用中就是无论你从哪个角度拍照只要四个点在一条直线上那么它们在图像平面上的投影点也共线并且交阻的计算结果是稳定的。我再强调一遍四个点在空间中共线是使用交比的前提。如果空间点不共线交比的值就没有意义因为它是定义在直线上的量。有了这个直觉背景接下来就可以把它翻译成数学语言了。3. 核心证明投影变换下交比的解析推演3.1 建立坐标模型把几何问题数字化证明交比不变性最常用的方法是解析法先给参与投影的点和直线建坐标系然后把交比写成坐标的代数式最后代入投影关系化简。先把问题简化到一维。设原直线上有四个点坐标分别为 x₁、x₂、x₃、x₄它们的交比为Cr [(x₁ - x₃)(x₂ - x₄)] / [(x₁ - x₄)(x₂ - x₃)]现在经过一个投影中心 O 的透视投影四条从 O 出发的射线 OA、OB、OC、OD在另一条直线投影后所在的直线上得到四个像点 A、B、C、D它们在新的直线坐标下的值为 x₁、x₂、x₃、x₄。目标是证明[(x₁ - x₃)(x₂ - x₄)] / [(x₁ - x₄)(x₂ - x₃)] [(x₁ - x₃)(x₂ - x₄)] / [(x₁ - x₄)(x₂ - x₃)]这就是交比不变性的代数表述。3.2 用斜率或三角函数表示交比这一步的关键是找到原直线坐标和新直线坐标之间的联系。从投影中心 O 出发有两条直线的夹角关系可用。设每条射线与某条基准方向比如原直线 l的夹角为 θᵢ那么直线上点的位置可以由该点的方向角决定。利用三角形面积比可以把线段之比转化为正弦之比AC / BC (OA · OC · sin∠AOC) / (OB · OC · sin∠BOC) (OA · sin∠AOC) / (OB · sin∠BOC)这样线段长度的依赖关系被拆开了OA 和 OB 这些到投影中心的距离项出现了。接下来看交比整体时会发现距离因子是可以约掉的(A, B; C, D) [ (AC/BC) ] / [ (AD/BD) ] [ (OA sin∠AOC) / (OB sin∠BOC) ] / [ (OA sin∠AOD) / (OB sin∠BOD) ] [ sin∠AOC / sin∠BOC ] / [ sin∠AOD / sin∠BOD ]这里 OA 和 OB 都在分子分母中成对出现直接约掉了。留下来的全部量只和角度有关也就是只依赖于从投影中心射出的四条光线的方向。3.3 最后的临门一脚角度不受投影直线位置影响上面已经得到交比可以用四个角度的正弦之比来表示(A, B; C, D) [sin∠AOC · sin∠BOD] / [sin∠BOC · sin∠AOD]注意右边这个式子完全由四条从 O 出发的射线决定跟它们被哪条直线截取无关。无论是在原直线 l 上取交点还是投影到新直线 l 上取交点这四条射线没有变因此右边一式完全一样。于是(A, B; C, D) [sin∠AOC · sin∠BOD] / [sin∠BOC · sin∠AOD] (A, B; C, D)证明完成。整个过程的关键点是余弦或正弦项取决于射线的夹角而夹角在中心投影中天然保持不变长度因子则通过对交比结构的两次相除自动消除。3.4 补充用坐标参数代入更一般的投影关系如果想把证明推广到投影变换不止单次中心投影可以使用直线坐标变换的参数形式。一维投影变换可以写成x (ax b) / (cx d)其中 ad - bc ≠ 0保证变换是可逆的也就是不会把一条直线压成一个点。代入交比公式验证(x₁, x₂; x₃, x₄) [(x₁ - x₃)(x₂ - x₄)] / [(x₁ - x₄)(x₂ - x₃)] [ (a x₁ b)/(c x₁ d) - (a x₃ b)/(c x₃ d) ] · ... 同类项 ... (x₁, x₂; x₃, x₄)数学推导中每一项的分母 (c xᵢ d) 都会在两两求差时产生公共因子并最终在整体比值中全部约掉。这个“分母约化”的过程就是射影变换保持交比的代数理由。我在实际推导中建议用符号计算工具先验算一遍这个公式折行展开很烦琐但机械运算不容易错。等到确认结果正确再手推一遍核心步骤理解会更透。注意很多教材中用 3×3 矩阵表示射影变换本质上和这里的 (axb)/(cxd) 是等价的。矩阵表达的优势是方便扩展到二维和三维情形但一维分式形式对证明交比不变性更直接。4. 另一种视角用矩阵和几何映射重新审视4.1 分式线性变换交比是它的“特征值”如果你熟悉复分析可能注意到一维射影变换 (axb)/(cxd) 正是分式线性变换也叫 Möbius 变换。在这个框架下交比不变性有另一种解释Möbius 变换保持广义圆直线是过无穷远点的圆而四个点的交比正是这个变换群下的基本不变量。这种观点还有一个额外收获它可以处理投影变换中出现的无穷远点。当四点的某个点位于无穷远时比如 x₄ → ∞交比的极限为lim (x₁, x₂; x₃, x₄) (x₁ - x₃)/(x₂ - x₃) 在特定约定下的简化结果这在实际计算中非常有用。比如在透视图像中平行线会交于灭点即无穷远点的像这时如果把灭点作为交比四点中的一点计算会大幅简化。4.2 交比与单应矩阵的关系在计算机视觉中平面到平面的投影通常用 3×3 的单应矩阵 H 来表示。直线在单应变换下仍然变成直线因此直线上四个点的共线关系保持不变。而交比作为一维射影不变量自然也在单应变换下保持不变。这个性质在实际工程中常在相机标定时使用。比如张正友标定法它利用棋盘格角点的几何约束来求解内参。棋盘格上的角点具有规则的直线排布如果你先提取出直线的角点再计算相邻角的交比可以快速验证特征点提取的准确性。如果图像中某些角点被遮挡或误检交比就会出现明显偏差这个特性比单纯的共线判定更能定位错误。我当年在做标定板的角点检测时就写了一个快速校验函数从每一行棋盘格角点中取四个共线点计算理论交比和图像中测量交比如果差值超过阈值就报出警告。实际用下来误检率直接降了一半。4.3 推广到二维平面上的对应问题交比定义在直线上但它在二维问题中也有用武之地。比如在立体视觉中当我们知道空间中某条直线上的几个点在一个视图中的位置想在另一个视图中找到对应点时可以先计算交比作为一个匹配描述子。由于极线约束和交比不变性同时成立匹配搜索空间可以大幅缩小。在图像校正、文档图像矫正、车道线检测中交比也被广泛使用。车道线的平行结构在透视图中变成相交线但沿车道线方向取四个标记点它们的交比依然是稳定的几何特征。这些应用本质上都是同一个数学性质在不同问题中的表达。5. 实操验证用数值实验验证交比不变性5.1 设计一个小实验我在学习这个定理时习惯用 Python 做个快速验证。下面给出一个简单脚本随机生成一条直线上的四个点然后施加一个任意的单应变换模拟投影看看交比是否保持不变。这个过程也可以帮助你验证自己的实现是否正确。import numpy as np def cross_ratio(x1, x2, x3, x4): return ((x1 - x3) * (x2 - x4)) / ((x1 - x4) * (x2 - x3)) # 随机生成一条直线上的四个点用二维齐次坐标表示 # 设直线为 y 2x 1取 x 坐标不同的四个点 xs np.array([1.0, 2.0, 4.0, 7.0]) points np.array([[xs[0], 2*xs[0]1, 1.0], [xs[1], 2*xs[1]1, 1.0], [xs[2], 2*xs[2]1, 1.0], [xs[3], 2*xs[3]1, 1.0]]) print(原始交比:, cross_ratio(xs[0], xs[1], xs[2], xs[3])) # 随机生成一个单应矩阵模拟投影变换 H np.array([[1.2, 0.3, -0.5], [0.1, 0.9, 0.2], [0.05, -0.1, 1.0]]) # 变换点并转回非齐次坐标 transformed (H points.T).T xt transformed[:, 0] / transformed[:, 2] yt transformed[:, 1] / transformed[:, 2] # 计算变换后四个点所在直线的参数其实交比可以直接用 xt 计算因为点仍共线 print(变换后交比:, cross_ratio(xt[0], xt[1], xt[2], xt[3]))我实际跑出来的结果中原始交比和变换后交比在小数点后 14 位内一致。这个实验虽然简单但它能直观检验你对“共线”和“交比定义”的理解。注意在代码里计算交比时一定要用点在这条直线上的一个坐标参数而不能直接取二维坐标的某一分量。因为二维坐标的某个分量在投影变换后并不对应于直线的自然参数误用会导致结果错误。你首先需要确认四个点仍然共线然后取它们在这条直线上的投影坐标例如用直线方程拟合后沿直线方向取距离参数或者对齐次坐标取合适的参数再计算交比。5.2 数值实验中最常踩的坑数值实验中第一个坑是“选择的点不共线”。由于单应变换可能产生数值误差变换后的点可能落在一条直线附近而非严格共线。计算交比时要使用拟合直线上的坐标而不是直接使用变换后点的某个分量。你应该先对四个点做直线拟合再把点投影到拟合直线上最后拿投影位置参数计算交比。第二个坑是精度问题。当四点中相邻两点非常接近时交比计算中会出现两个接近相等的数相减导致有效数字丢失。解决办法在仿真时尽量让点之间保持合理间距如果实际数据中确实出现近邻点就要考虑使用更高精度的浮点数格式如双精度甚至更高精度的有理数运算。第三个坑常出现在真实图像数据中特征点检测的像素误差会产生噪声而交比的非线性结构会放大这些噪声。这也是为什么在工程应用中大家通常取多个四点组合求平均交比而不是只依赖一组点。5.3 工程实测棋盘格角点的交比校验在相机标定项目中我通常在校验角点检测结果时使用交比。棋盘格上每一行的角点间距是均匀的但空间等距点在图像中由于透视畸变并不等距。此时可以取同一行上的四个角点比如第 1、第 4、第 10、第 20 个理论上它们是有理数交比而图像中计算出的交比应该与理论值一致。实际操作时我写了这个校验函数def check_collinear_cross_ratio(points, expect_ratio, threshold0.05): # points: 共线的4个二维点 # 先把点拟合成一条直线获取直线参数再投影到直线上 p np.array(points, dtypefloat) # 用主成分分析找直线方向 center p.mean(axis0) cov (p - center).T (p - center) eigval, eigvec np.linalg.eig(cov) direction eigvec[:, np.argmax(eigval)] t (p - center) direction ratio cross_ratio(t[0], t[1], t[2], t[3]) return abs(ratio - expect_ratio) threshold, ratio用这个函数在图像中每一行取角点组合验证凡是交比与理论值偏差过大的行就标记为“疑似误检”后续用亚像素定位去精修。这一招在光照不均、角点存在反光斑的场景下特别有效。6. 常见问题与工程笔记6.1 交比与仿射比的区别仿射比如线段中点比在刚体变换和仿射变换下保持不变但到了射影变换就会失效。交比则是“升级版”的比值它在射影变换下依然保持。二者关系可以这样记仿射比是三个点的关系例如 (A,B;C)交比是四个点的关系例如 (A,B;C,D)当你做比仿射变换更一般的变换时请把测量值设计成交比的形式这样才具备不变性。6.2 点的顺序为什么很重要交比的数值依赖点的顺序。同样四个点顺序不同导致的结果可能是原值、倒数、1 减去原值等。工程上我们在匹配时需要保持四个点的顺序一致如果不一致就要制定对应的排序规则确保交比计算方式相同。我习惯在工程代码里封装一个函数永远输出“按坐标从小到大排序后的交比”配合点索引记录原始顺序。这样可以避免大量由顺序引起的隐性 bug。6.3 如果四个点中有无穷远点怎么办这在真实场景中很常见比如平行线在图像中交于灭点。把灭点作为交比四点之一交比仍然有定义只需要在计算时取极限。但要注意的是无穷远点在图像中的像素坐标可能受到镜头畸变的影响灭点检测不准会直接污染交比计算。所以用灭点做交比测量时建议先做畸变校正。6.4 交比能用于曲线特征匹配吗不能直接用于曲线因为交比定义在直线上的点列。但曲线上的点可以先投影到某一条直线或者在曲线上取四个参数点用曲线的参数坐标计算交比。这种做法在某些场景下有近似意义但严格来说它不再具有射影不变性。7. 我的实操心得交比给我的三个提醒第一个提醒是数学定理的证明虽然抽象但每一步都会在工程里以某种方式“显灵”。交比不变性的证明中角度正弦的比值替换消去了距离因子这让我在后来处理相机相对位姿估算时更习惯于从角度约束去拆解问题而不是一味追求长度测量。第二个提醒是一切几何测量都要挂在某个不变量上。在做任何透视相关的测量算法时先问自己这个量在射影变换下变不变如果变就要寻找替代方案。交比往往是我最早尝试的候选不变量因为它成本低、计算简单。第三个提醒是代数和几何是互相印证的。交比不变性通过代数很容易验证但真正能让你在遇到实际问题时想到“这里可以用交比”的是几何直觉。建议学习时两手抓一边动手推导公式一边在图像上画出射线和交点观察角度关系。几何直觉帮你想出方案代数推导帮你保证方案严格成立。
网站建设高端定制企业官网