![]() |
1
11
我只需要解决这个问题 重映射反演问题 我和我将概述我的解决方案。
鉴于
我计算
首先,我构建了一个
KD-Tree
对于二维点集:
然后我循环通过所有
注意,如果
像个魔咒!在我的第一个版本中,我尝试了暴力强制搜索,我甚至从未等待它完成。我切换到KD树,然后开始获得合理的运行时间。如果我有时间,我想把这个添加到OpenCV中。
下面的第二幅图像是使用
|
![]() |
2
6
迭代解上面的许多解决方案对我不起作用,当地图不可逆或速度不快时失败。 我提出了另一种6行迭代解决方案。
它做得怎么样? 在我为航空摄影反转地形校正地图的用例中,该方法以10步轻松收敛到1/10像素。它也非常快,因为所有繁重的计算都隐藏在OpenCV中 它是如何工作的?
该方法使用的思想是:
我们可以继续完善我们的映射,上面给出了我们的第一个预测(我是“身份映射”):
我们的第二个预测可以从中进行调整:
等等:
证明
假定
然后得到:
测试脚本
|
![]() |
3
5
这是一个重要的问题,我感到惊讶的是,任何标准库都没有更好地解决这个问题(至少据我所知)。 我对接受的解决方案不满意,因为它没有使用转换的隐式平滑。我可能会错过重要的情况,但我无法想象在任何有用的意义上都是可逆的,并且在像素尺度上是非平滑的映射。 平滑意味着不需要计算最近邻点:最近点是原始网格上已经接近的点。 我的解决方案使用了以下事实:在原始映射中,正方形[(i,j),(i+1,j)、(i+1、j+1)、(i,j+1)]映射到四边形[(X[i,j]、Y[i,j]、X[i+1,j]、Y[i+2,j]、…],内部没有其他点。然后逆映射只需要在四边形内进行插值。为此,我使用逆双线性插值,这将在顶点和任何其他仿射变换处给出精确结果。
该实现除了
关于不太明显的东西的一些评论:
下面是一个测试示例
|
![]() |
4
3
您可以在已知点处反转贴图,并将其插值到新网格中。 它可以正常工作,但失真不是很大。 下面是使用scipy.interpolate.griddata在Python中的一个非常简单的实现:
如果将CV_32FC2用于贴图,则可以简化点构造:
|
![]() |
5
2
如果映射是从单应性导出的
e、 g.在Python中:
OpenCV文档说明了
如果你刚刚给了地图,你必须自己做。 Hoewever说,新地图坐标的插值并不简单,因为一个像素的支持区域可能非常大。 下面是一个简单的Python解决方案,它通过执行点到点映射来反转映射。这可能会使一些坐标未分配,而其他坐标将被更新数次。所以地图上可能有洞。 下面是一个小型Python程序,演示了两种方法:
|
![]() |
6
2
下面是@wcochran答案的实现。我正试图恢复lensfunpy导致的镜片矫正。
|
![]() |
7
1
KNN回归器具有反转网格映射所需的所有组件! 干得好:
|
![]() |
8
0
没有任何标准的方法可以做到这一点 OpenCV . 如果您正在寻找一个完整的即用解决方案,我不确定我是否能提供帮助,但我至少可以描述几年前我用于完成此任务的一种方法。 首先,您应该创建与源图像具有相同维度的重映射映射。为了简化插值,我创建了更大尺寸的地图,并在最后一步将其裁剪为适当大小。然后,您应该用以前重新映射映射映射中存在的值填充它们(不太困难:只需迭代它们,如果映射坐标x和y位于图像的范围内,则将它们的行和列作为新的y和x,并将其放入新映射的旧x和y列和行中)。这是一个相当简单的解决方案,但它给出了相当好的结果。为了达到完美的效果,您应该使用插值方法和相邻像素将旧的x和y插值为整数值。 在此之后,您应该手动重新映射像素颜色,或者用像素坐标完全填充重新映射的地图,并使用OpenCV的版本。
您将遇到一个相当具有挑战性的任务:您应该在空白区域中插入像素。换言之,您应该获取到最接近的非零像素坐标的距离,并根据这些距离混合颜色(如果您重新映射颜色)或坐标(如果您继续进行完整贴图计算)。实际上,对于线性插值来说也不是那么困难,您甚至可以研究
最后一个任务是将区域外推到重新映射的像素区域的边界之外。OpenCV的算法也可以作为参考。 |
![]() |
9
0
在这里操作。我想我找到了答案。我还没有实现它,如果有人提出了一个不那么复杂的解决方案(或者发现这个方案有问题),我会选择他们的答案。 问题陈述设A为源图像,B为目标图像,M为从A坐标到B坐标的映射,即:
…其中,方括号表示使用整数索引的数组查找,圆括号表示使用浮点索引的双线性插值查找。我们使用更经济的符号重申上述内容:
我们希望找到一个逆映射N,它将B尽可能地映射回A:
可以在不参考A或B的情况下说明问题:
哪里
朴素的解决方案如果M的值都是整数,并且M是同构,则可以直接将N构造为:
或者在我们的简化符号中:
…其中I_m是具有与m相同维度的身份映射。 存在两个问题:
解决方案将空N构造为浮点的三维张量:
对于A坐标空间中的每个坐标[i,j],执行以下操作:
这里潜在昂贵的步骤是在步骤1中搜索包围[i,j]的M中的2x2坐标网格。暴力搜索将使整个算法成为O(n*m),其中n是A中的像素数,m是B中的像素数目。 为了将其简化为O(n),可以在每个a坐标四边形内运行扫描线算法,以识别其包含的所有整数值坐标[i,j]。这可以预先计算为一个哈希映射,将整数值a坐标[i,j]映射到其包围四边形的B坐标[k,l]的左上角。 |
![]() |
10
0
一种方法是获取原始映射,遍历其条目,并获取x和y值的下限和上限。这给出了(x,y),(x)周围的四个最近整数 f y f ),(x) c y f ),(x) f y c )和(x) c y c )在原始源图像的坐标中。然后,您可以将这些数据作为包含像素值和权重的索引填充到一个结构中,并对这些数据使用您首选的不规则网格插值。 这很容易用逆距离插值实现,因为该结构可以是图像阵列累加,并且权重是标量。F是原始源,G是扭曲图像,F'是恢复图像。地图是M。 将F'初始化为0。创建一个0初始化的权重数组W,其大小与F'相同。 迭代M。对于M中的每个,找到4个整数对及其与(x,y)的距离。从G中获取相应的像素值,按其倒数距离对其进行加权,并将其累加为F'like
然后将该重量累积到
完成后,通过迭代将F'归一化,并将每个像素除以其在W中的相应条目(如果它不是零)。 在这一点上,图像通常几乎完成,但在高下采样率下,F’中的某些像素可能无法填充。然后你在W中来回传递几次,找到0个权重条目,并从它们的非空邻居中插值这些像素。这一部分也可以通过KNN搜索和插值来完成,因为它们通常并不多。 它很容易实现,比KNN方法的伸缩性好得多(尽管我认为这对小图像很好)。缺点是,反向距离不是最好的插值方案,但如果映射不是太笨拙,并且原始图像没有被多次下采样,它似乎工作得相当好。当然,如果下采样率很高,你就必须推断出大量丢失的信息,因此它必然会给出粗略的结果。 如果您想从地图反演中挤出尽可能多的空间,可以尝试求解由原始插值方案定义的(可能未确定的)方程组;这并非不可能,但具有挑战性。 |
![]() |
11
-1
据我所知,你有一个原始图像和一个变换的图像,你希望在不知道的情况下恢复已应用的变换的性质,但假设它是有意义的,比如旋转或鱼眼扭曲。 我要尝试的是在索引图像和普通图像中对图像进行阈值处理,将其转换为二进制。然后尝试识别对象。大多数映射至少会保留连通性和欧拉数,大多数情况下,索引中最大的对象仍然是平原中的最大对象。 然后为匹配的图像/索引对花点时间,看看是否可以删除平移、旋转和缩放。这将提供几个反向贴图,然后您可以尝试将其缝合在一起。(如果变换不简单,则很难,但无法解决重构任何变换的一般问题)。 |
![]() |
PKrange · 未在Anaconda提示符上安装Opencv 2 年前 |
![]() |
GabyUnalaq · 从原始RGB深度图像到灰度的转换不正确 2 年前 |
![]() |
Sam12 · 棋盘检测方块OpenCV 3 年前 |
![]() |
pete2213 · 从一个图像到另一个图像的梯度转移以增强边缘 3 年前 |