从图像像素提取可匹配观测
本课的终点是把多张二维图像变成可渲染、可验收的三维表示。读者需要会向量加减、矩阵乘法与基础 Python;奇异值分解作为明确说明作用的数值工具导入。我们的图像来自自己定义的三维发光珠场景,但重建程序必须重新打开实际 PNG,从像素自动找观测,不能读取生成时的三维坐标再假装检测。真值只在拟合结束后用于量化误差。这一信息边界是项目第一条合同。
先固定坐标约定。图像宽度为九十六、高度八十,数组形状是高度、宽度、颜色通道;索引顺序为行再列。像素横坐标 u 向右、纵坐标 v 向下,整数位置表示采样中心。世界位置用米,相机焦距用像素,二者不能直接相加。图像中的一次水平移动是像素量,三维物体移动多少米需要相机和深度才能解释。文件名、尺寸、通道、散列和坐标约定一同进入输入清单。
PNG 是可读取的观测载体,不保证像素已经具有线性辐射意义。这里合成器先得到线性强度,再量化为八位 RGB,读取时除以二百五十五;它没有额外施加伽马曲线,所以这套模型内部可以直接比较强度。真实相机的曝光、白平衡、伽马、压缩及镜头畸变需要另外建模,不能因为扩展名同为 PNG 就假定相同物理语义。我们也不把一个亮斑直接称为已识别的现实物体。
设图像位置为整数对,三个通道的观测向量为 I。已知本实验背景强度 b 等于零点零一五,先逐通道截去负值,得到信号 S。再用三个信号通道最大值作为检测权重 w。候选掩码由 w 大于零点零六五确定。这个阈值是当前受控图像的固定工程选择,不是普遍颜色识别定理;降低阈值会保留更多尾部,也可能把背景噪声连成区域。
候选像素还不是物体列表。我们把共享上、下、左、右边的像素看作四邻接,用队列广度优先遍历:遇到尚未访问的候选像素便建立新区域,入队时标记,出队后检查四个邻居。每个像素至多入队一次,因此扫描和遍历都受像素总数的常数倍控制;最坏存储与图像面积成正比。对角接触是否算同一区域由邻接约定决定,不能在不同图像间悄悄切换。
对一个区域,先保存像素数、最小最大坐标及带权质心。质心是坐标乘权重的和除以总权重,分母正是因为所有区域像素都超过正阈值。它通常具有亚像素数值,但“有小数”不代表拥有同样数量的可信小数位。截断尾部、采样格、重叠亮斑都会造成偏差。项目保存包围框和面积,方便回到实际图像检查,而不是只留下两列数字。
算例一:从四个实际候选像素计算观测
设区域四个像素依次位于横纵坐标二与一、三与一、二与二、三与二,对应权重一、二、三、四。总权重十,横坐标加权和二十六,纵坐标加权和十七,因此质心为二点六与一点七。包围框横向二到三、纵向一到二,面积四。普通平均会给二点五与一点五,二者差异来自亮度分布,不是浮点错误。区域虽然只有四个整格点,观测可以落在格点之间。
如果删去最亮的右下像素,剩下总权重六,横坐标和十四、纵坐标和九,质心的横坐标十四除六等于三分之七,约二点三三三;九除六为一点五。横向偏移约负零点二六七,纵向负零点二。遮挡改变测量本身,不只是让噪声变大。后续三角化若把这个偏移当作真实视差,会产生有方向的深度偏差,平均更多同类遮挡图像也不能保证消除。
跨视角匹配还需要描述子。我们把区域内三个信号通道分别求和,得到三维颜色总量,再除以其欧氏长度,使描述子只保留颜色方向。若所有通道乘同一个正曝光因子,归一化结果相同;若白平衡分别改变通道,方向便会改变。颜色归一化减少一种变化,并没有发明对所有光照不变的物体身份。每张图中的观测 ID 只是本地遍历编号,不能据它直接跨图连接。
算例二:归一化描述子的成功与必败情况
一个区域总颜色为六、二、二,向量长度为根号四十四;另一个视图为三、一、一,长度为根号十一,归一化后完全相同,因此适合建立候选对应。若第二张图另有一个颜色也为三、一、一的区域,两个候选距离都为零,颜色信息无法区分身份。此时必须拒绝歧义或补充局部纹理与几何约束,不能以排序恰好先遇到谁作为“正确识别”的证据。
实际项目先按固定相机生成五张未知场景图像与五张单独标定图像,再运行同一个像素检测器。三张未知场景图用于训练,两张保留作新视角评价。标定图展示已知的非共面彩色标靶,可以用其已知几何估相机;它与未知场景不是同一组坐标。读者应打开图片确认亮斑存在,再比对检测包围框、观测数和散列。生成器知道真值与重建器能偷看真值是两件不同的事。
这套颜色标记是为了隔离几何机制的人工设计,不等价于自然图像特征。它仍包含真实的栅格化、量化、阈值和跨视角观测误差,并允许在文件层删除真值后运行。透明亮斑相互重叠时,四邻接会把两个珠子合成一区域;若它们颜色混合,新描述子也可能不属于任何一个珠子。这里不应强行补成预定数量,而应让缺失观测暴露给后续流程。
误差管理要区分没有观测、观测存在但位置偏移、以及观测匹配错三类。第一类减少可重建范围,第二类传播成连续位置不确定性,第三类可能产生完全不同的三维点。后续章节分别设置正深度、极线和重投影检查,但任何检查都有适用条件。当前小图检测成功只说明在受控图像模型中提取到了亮斑,并不支持“能理解任意照片”的结论。
量化误差可用一个通道的小例子定界。把线性强度乘二百五十五再四舍五入,未裁剪时重读误差绝对值最多半个量化格,即约零点零零一九六。靠近阈值的像素可能因这一步从候选变成背景,使连通性产生离散跳变。因而不能用单个像素强度的连续误差界直接当质心的连续误差界;区域一旦断裂或合并,观测数量都会改变。测试应既看数值偏移,也看分量数是否改变。
对称光斑在连续无限平面上的质心正好是投影中心,因为偏移积分中的奇函数项抵消。但有限像素网格和固定阈值截断未必保持完美对称,尤其中心不落在整数格时。项目观察到的百分之几像素标定残差正是在这条链上产生,不应先把检测质心替换为生成器精确投影来“修好”结果。保留这种小但真实的偏差,才能检验相机估计和后续拟合是否共同工作。
weights=[1,2,3,4]
uv=[(2,1),(3,1),(2,2),(3,2)]
s=sum(weights)
centroid=tuple(sum(w*p[d] for w,p in zip(weights,uv))/s for d in range(2))
assert centroid==(2.6,1.7)
print(centroid)TRY IT YOURSELF
练习一:邻接约定
一个二乘二掩码仅左上与右下为真。四邻接和八邻接各有几个分量?若把它们合成一物体,会多做什么假设?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习二:曝光与颜色
颜色向量为二、一、零,同曝光因子三与分通道因子三、一、一分别给什么归一化方向?哪种变化被描述子消除?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习三:信息边界
检测程序若读取三维真值并投影成像素,再拿这个点表去三角化,为什么不能验收“图像到三维”?应怎样构造反证测试?