C 亚像素精度图像块局部最大值的鲁棒搜索
我正在用C语言开发一个SLAM算法,并且我已经实现了快速角点查找方法,该方法为我提供了图像中的一些关键点。下一步是以亚像素精度获得关键点的中心,因此我在每个关键点周围提取一个3x3面片,并对二维二次曲线进行最小二乘拟合: 其中,fx,y是每个像素的角显著性度量,类似于上建议的FAST分数,但经过修改以在非角像素中也提供显著性度量 最小二乘法: 作为估计参数。 我现在可以计算拟合二次曲线的峰值位置,通过将梯度取为零,实现我最初的目标 该问题出现在一些角点情况下,其中局部峰值更接近窗口边缘,导致拟合残差较低,但在窗口外出现二次型峰值 例如: 拟合二次曲线的角显著性和轮廓: 显著性蓝色和拟合红色作为三维网格: 此示例的数值按行主顺序排列:C 亚像素精度图像块局部最大值的鲁棒搜索,c,opencv,image-processing,computer-vision,slam,C,Opencv,Image Processing,Computer Vision,Slam,我正在用C语言开发一个SLAM算法,并且我已经实现了快速角点查找方法,该方法为我提供了图像中的一些关键点。下一步是以亚像素精度获得关键点的中心,因此我在每个关键点周围提取一个3x3面片,并对二维二次曲线进行最小二乘拟合: 其中,fx,y是每个像素的角显著性度量,类似于上建议的FAST分数,但经过修改以在非角像素中也提供显著性度量 最小二乘法: 作为估计参数。 我现在可以计算拟合二次曲线的峰值位置,通过将梯度取为零,实现我最初的目标 该问题出现在一些角点情况下,其中局部峰值更接近窗口边缘,导致拟合
[336, 522, 483, 423, 539, 153, 221, 412, 234]
得到的亚像素中心2.6,-17.1是错误的
如何约束拟合,使中心位于窗口内?
我对寻找亚像素峰值的其他方法持开放态度。显而易见的答案是拒绝3x3或5x5,无论您使用的是离散最大值不在中心的框。换句话说,仅使用二次近似来优化必须位于框内的最大值的位置 更一般地说,在这种情况下,首先要问的问题不是如何约束模型拟合过程,以便为这种边缘情况找到解决方案,而是
我的模型是否适用于此edge案例?这个边缘案例是否值得花费时间,或者我可以忽略它吗?显而易见的答案是拒绝3x3或5x5,无论您使用的盒子离散最大值不在中心。换句话说,仅使用二次近似来优化必须位于框内的最大值的位置 更一般地说,在这种情况下,首先要问的问题不是如何约束模型拟合过程,以便为这种边缘情况找到解决方案,而是
我的模型是否适用于此edge案例?这个边缘情况是否值得花费时间,或者我可以忽略它吗?我尝试了自己的代码,使用稳定的最小二乘解算算法,将二维二次函数拟合到3x3值,还发现了域外的最大值。3x3数据块与二次函数不匹配,因此拟合没有用处 将二维二次曲线拟合到3x3邻域需要数据具有一定程度的平滑度,而您的快速输出中似乎没有这种平滑度 还有许多其他方法可以找到最大值的亚像素位置。我喜欢的一个方法是拟合一个可分离的二次函数,因为它更稳定,计算量更小。简言之,将二次函数拟合到一个维度中局部最大值周围的三个值,然后在另一个维度中拟合另一个值。这不是用9个值求解6个参数,而是用3个值求解3个参数,两次。只要中心像素大于或等于4连通邻域中的所有像素,该解决方案就可以保证稳定
z1 = [f(-1,0), f(0,0), f(1,0)]^T
[1,-1,0]
X = [0,0,0]
[1,1,0]
solve: X b1 = z1
及
现在从b1得到质心的x坐标,从b2得到y坐标。我用自己的代码,使用稳定的最小二乘求解算法,将2D二次函数拟合到3x3值,还发现了域外的最大值。3x3数据块与二次函数不匹配,因此拟合没有用处 将二维二次曲线拟合到3x3邻域需要数据具有一定程度的平滑度,而您的快速输出中似乎没有这种平滑度 还有许多其他方法可以找到最大值的亚像素位置。我喜欢的一个方法是拟合一个可分离的二次函数,因为它更稳定,计算量更小。简言之,将二次函数拟合到一个维度中局部最大值周围的三个值,然后在另一个维度中拟合另一个值。这不是用9个值求解6个参数,而是用3个值求解3个参数,两次。只要中心像素大于或等于4连通邻域中的所有像素,该解决方案就可以保证稳定
z1 = [f(-1,0), f(0,0), f(1,0)]^T
[1,-1,0]
X = [0,0,0]
[1,1,0]
solve: X b1 = z1
及
现在,您可以从b1获得质心的x坐标,从b2获得y坐标。仔细检查您的计算,拟合是可疑的。您好@YvesDaoust,谢谢您的回复。我用合成数据测试了拟合度,它的表现似乎与预期相符。可能还有其他想法吗?你能提供这九个值吗?拟合错误是因为你的逆矩阵不稳定吗?你试过用奇异值分解法解方程吗
ition?@YvesDaoust这些值是[336,522,483,423,539,153,221,412,234]行主调,但我想这是不相关的。仔细检查你的计算,拟合是可疑的。嗨@YvesDaoust,谢谢你的回答。我用合成数据测试了拟合度,它的表现似乎与预期相符。可能还有其他想法吗?你能提供这九个值吗?拟合错误是因为你的逆矩阵不稳定吗?你试过用奇异值分解法解这个方程吗?@YvesDaoust这些值是[336,522,483,423,539,153,221,412,234]行,但我想那是不相关的。我明白你的意思,但我相信我应该开发一个解决方案来处理这样的情况,因为局部最大值在3x3区域。例如,我想到了一个解决方案,它的成本是x0,y0到1,1的距离,但不幸的是,我负担不起计算优化算法。一定有什么把戏让我无法理解。。谢谢你的回答我明白你的意思,但我相信我应该开发一个解决方案来处理这样的情况,因为本地最大值在3x3区域。例如,我想到了一个解决方案,它的成本是x0,y0到1,1的距离,但不幸的是,我负担不起计算优化算法。一定有什么把戏让我无法理解。。谢谢你的回答。那当然是个好主意。虽然这样会丢弃窗口中四个未使用像素上的信息,但我不确定这会产生什么影响。在你看来,对对角线重复这个过程,并将中心作为两点的平均值会更好吗?Thanks@Bobisnotyouruncle:你当然可以试试。请记住,对于对角线,像素之间的距离是sqrt2,而不是1。因为这些距离更大,你可能想考虑一个加权平均值,其中对角线的结果比主轴的结果小一点。@ Bobisnotyouruncle:尽管亚像素精度很重要,但你可能需要考虑一个能产生平滑输出的角点检测器。FAST使用各种丑陋的过滤内核,导致输出不平滑。对导数使用适当的高斯滤波可以得到平滑的输出,其中插值实际上是有意义的,并且每个3x3面片都可以由2D二次曲面正确建模。谢谢,我会尝试一下。使用FAST的原因是计算能力的极大限制,我的想法是,亚像素方法应该基于FAST显著性分数,因为这是一个对社区中心像素更高的度量,这当然是一个好主意。虽然这样会丢弃窗口中四个未使用像素上的信息,但我不确定这会产生什么影响。在你看来,对对角线重复这个过程,并将中心作为两点的平均值会更好吗?Thanks@Bobisnotyouruncle:你当然可以试试。请记住,对于对角线,像素之间的距离是sqrt2,而不是1。因为这些距离更大,你可能想考虑一个加权平均值,其中对角线的结果比主轴的结果小一点。@ Bobisnotyouruncle:尽管亚像素精度很重要,但你可能需要考虑一个能产生平滑输出的角点检测器。FAST使用各种丑陋的过滤内核,导致输出不平滑。对导数使用适当的高斯滤波可以得到平滑的输出,其中插值实际上是有意义的,并且每个3x3面片都可以由2D二次曲面正确建模。谢谢,我会尝试一下。使用FAST的原因是计算能力的极限,我的想法是,亚像素方法应该基于FAST显著性分数,因为这是邻域中心像素更高的度量