反转实值索引网格

2023-11-24

OpenCV 的remap()使用实值索引网格通过双线性插值对图像中的值网格进行采样,并将样本网格作为新图像返回。

准确地说,让:

A = an image 
X = a grid of real-valued X coords into the image. 
Y = a grid of real-valued Y coords into the image.
B = remap(A, X, Y)

然后对于所有像素坐标 i, j,

B[i, j] = A(X[i, j], Y[i, j]) 

其中圆括号表示法A(x, y)表示使用双线性插值法通过浮点值坐标求解图像 A 的像素值x and y.

我的问题是:给定一个索引网格X, Y,如何生成“逆网格”X^-1, Y^-1这样:

X(X^-1[i, j], Y^-1[i, j]) = i
Y(X^-1[i, j], Y^-1[i, j]) = j

And

X^-1(X[i, j], Y[i, j]) = i
Y^-1(X[i, j], Y[i, j]) = j

对于所有整数像素坐标i, j?

FWIW,图像和索引图 X 和 Y 的形状相同。然而,索引图 X 和 Y 没有先验结构。例如,它们不一定是仿射或刚性变换。它们甚至可能是不可逆的,例如如果X, Y将多个像素映射到A到 B 中相同的精确像素坐标。我正在寻找一种方法的想法,该方法可以找到合理的逆映射(如果存在)。

该解决方案不需要基于 OpenCV,因为我没有使用 OpenCV,而是另一个具有remap()执行。虽然欢迎提出任何建议,但我特别热衷于“数学上正确”的东西,即如果我的映射 M 是完全可逆的,则该方法应该在机器精度的一些小范围内找到完美的逆。


好吧,我只需要解决这个问题重映射反转问题我自己和我将概述我的解决方案。

Given X, Y为了remap()执行以下操作的函数:

B[i, j] = A(X[i, j], Y[i, j])   

我计算过Xinv, Yinv可以使用remap()功能为invert过程:

A[x, y] = B(Xinv[x,y],Yinv[x,y])

首先我建立一个KD-Tree对于 2D 点集{(X[i,j],Y[i,j]}这样我就可以有效地找到N给定点的最近邻居(x,y).我使用欧几里得距离作为距离度量。我发现了一个很棒的KD-Trees 的 C++ 头文件库在 GitHub 上。

然后我循环遍历所有(x,y)值在A的网格并找到N = 5最近的邻居{(X[i_k,j_k],Y[i_k,j_k]) | k = 0 .. N-1}在我的点集中。

  • 如果距离d_k == 0对于一些k then Xinv[x,y] = i_k and Yinv[x,y] = j_k, 否则...

  • Use 反距离加权 (IDW)计算插值:

    • 让重量w_k = 1 / pow(d_k, p)(我用p = 2)
    • Xinv[x,y] = (sum_k w_k * i_k)/(sum_k w_k)
    • Yinv[x,y] = (sum_k w_k * j_k)/(sum_k w_k)

请注意,如果B is a W x H那么图像X and Y are W x H浮点数数组。如果A is a w x h那么图像Xinv and Yinv are w x h浮点数组。图像和地图尺寸保持一致非常重要。

奇迹般有效!我的第一个版本尝试了暴力搜索,但我什至没有等到它完成。我切换到 KD-Tree 然后开始获得合理的运行时间。如果我有时间的话我想把它添加到 OpenCV 中。

下面第二张图是使用remap()消除第一张图像中的镜头畸变。第三张图像是反转该过程的结果。

enter image description here enter image description here enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反转实值索引网格 的相关文章

  • minAreaRect OpenCV 返回的裁剪矩形 [Python]

    minAreaRectOpenCV 中返回一个旋转的矩形 如何裁剪矩形内图像的这部分 boxPoints返回旋转矩形的角点的坐标 以便可以通过循环框内的点来访问像素 但是在 Python 中是否有更快的裁剪方法 EDIT See code在
  • 数学 - 映射数字

    如何将 a 和 b 之间的数字线性映射到 c 和 d 之间 也就是说 我希望 2 到 6 之间的数字映射到 10 到 20 之间的数字 但我需要广义的情况 我的脑子炸了 如果您的数字 X 位于 A 和 B 之间 并且您希望 Y 位于 C 和
  • 两组数的最小公等和及组合

    我目前正在用 C 创建一个程序 该程序将查找两组数字的尽可能低的相等总和 您可以在其中根据需要多次重复这些数字 比如我有这两套 10 13 18 and 12 16 22 我能得到的最低金额是28 10 18 and 12 16 另一个例子
  • 如何自定义舍入形式

    我的问题可能看起来很简单 但仍然无法得到有效的东西 我需要自定义 Math round 舍入格式或其他格式以使其工作如下 如果数字是 1 6 他应该四舍五入到 1 如果大于或等于 1 7 他应该四舍五入到 2 0 对于所有其他带有 6 的小
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 这个按位运算如何检查 2 的幂?

    我正在看一些应该很简单的代码 但我的数学在这里严重失败 下面是一个使用以下条件检查数字是否为 2 的幂的条件 if num 1 num num 1 make num pow of 2 我的问题是 如何在 num 和 num 1 之间使用按位
  • 如何在 python 中读取 32 位 TIFF 图像?

    我想用 python 读取 32 位浮点图像文件来进行一些图像分析 我努力了 import matplotlib pyplot as plt im plt imread path to file tif 但是 这仅将数据读取为 8 位整数值
  • 比较批处理文件中的两个数字

    我在这个网站上搜索了我的问题 但没有找到解决我问题的方法 系统为玩家和计算机提供一个从 2 到 12 的随机数 这有 3 部分 X 大于 Y 如果 X 小于 Y 以及当 X 与 Y 相同 当我开始 bat 效果很好 我选择Play Game
  • 在球体边缘绘制点

    因此 来自 Flash 背景的我对一些简单的 2D 三角函数有很好的理解 在带有 I 圆的二维中 我知道使用给定角度和半径将项目放置在边缘上的数学 x cos a r y sin a r 现在 如果我在 3d 空间中有一个点 我知道球体的半
  • 在 Blackberry 4.2 JDE 上调用 atan 函数

    我需要从我的 Blackberry Java 应用程序计算反正切值 不幸的是 blackberry 4 2 api 没有 Math atan 函数 Blackberry JDE 4 6 版有此功能 但 4 2 版没有 有谁知道计算 atan
  • 如何使用 opencv python 计算乐高积木上的孔数?

    我正在开发我的 python 项目 我需要计算每个乐高积木组件中有多少个孔 我将从输入 json 文件中获取有关需要计算哪个程序集的信息 如下所示 img 001 red 0 blue 2 white 1 grey 1 yellow 1 r
  • 如何绘制更大的边界框和仅裁剪边界框文本 Python Opencv

    我正在使用 easyocr 来检测图像中的文本 该方法给出输出边界框 输入图像如下所示 Image 1 Image 2 使用下面的代码获得输出图像 But I want to draw a Single Bigger bounding bo
  • 有 JavaScript 的微积分库吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道 JavaScript 的微积分库吗 我做了一些谷歌搜索 但没有想出任何东西 我申请了 Wolf
  • android中根据屏幕尺寸计算图像尺寸

    我正在尝试根据屏幕尺寸计算图像高度和宽度 我从后端获取 5 x 7 尺寸的图像 为了将像素乘以 72 进行转换 我有 360 X 504 尺寸的图像 对于 360 X 504 我的动态透明矩形区域将显示为 1 223 x 1 179 即 8
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • CGPoint 标量乘法 Swift

    我正在 SpriteKit 中构建一个平台游戏 并将为我的实体实现更新功能 以便它们根据重力和速度移动 但是 我需要使添加的速度量与增量时间成比例 以防止帧速率影响我的实体的移动方式 因此我将导入 GLKit 以便我可以使用标量函数 但是
  • 如何舍入、取整、取整、截断

    如何对 jq jq 1 5 1 a5b5cbe 中的数字进行舍入 取整 取整和截断 例如 与 mass 188 72 我想 mass 188 有地板 mass 189 与天花板和圆形 舍入示例 5 52 gt 6 5 50 gt 5 or
  • 如何使用网格分割图像并保留透明度边界框

    我有一些 png 图像 我想将其分成几个部分 例如按网格或大小 但每个部分应具有与原始图像相同的边界框 透明度 Example 将图像分成两部分 原来的 200 89 Output 部分 1 png 200 89 第2部分 png 200

随机推荐

  • Python/Django shell 无法启动

    Django 的一大特色是您可以打开 python 解释器设置以用于您的项目 这可用于分析数据库中的对象 并允许在您的项目上执行任何 python 命令 我发现它对于 Django 开发至关重要 使用以下命令在项目目录中调用它 python
  • Flutter / Dart AES-256-CBC 从 PHP 中的加密中解密

    任何人都可以帮助我找出使用 AES 256 CBC 在 PHP 中加密的数据的解密算法 我尝试了很多不同的方法 但我认为在尝试复制在 Dart 中重新创建 Key IV 的方法时我搞砸了 并且不断收到异常 例如 RangeError end
  • 当 DataSource 为空时,WPF DataGrid 无法添加行

    CanUserAddRows True 仅当已经有数据时才有效ItemsSource of the DataGrid 如果原始项目列表中没有行 则DataGrid不显示用于输入新项目的占位符行 即使我已设置CanUserAddRows Tr
  • C# 模式防止事件处理程序挂钩两次 [重复]

    这个问题在这里已经有答案了 重复 如何确保一个事件只订阅一次 and 是否已添加事件处理程序 我有一个提供一些服务的单例 我的类挂钩到它的一些事件 有时一个类挂钩两次事件 然后被调用两次 我正在寻找一种经典的方法来防止这种情况发生 不知何故
  • java线程和主线程

    让主线程等待所有线程完成的最佳方法是什么 for int i 0 i
  • 如何以编程方式检测 iPhone 中的 EDGE 网络或不良网络?

    我需要检测iPhone中的EDGE网络和不良网络 1 如何检测信号不好 2 是否可以检测边缘网络分别地 3 如何获得网络的强度 请就这些问题给出一些答案 提前致谢 在 iOS7 上 你可以 http www objc io issue 5
  • 对于 C++ 重载解析,为什么 {} 是 int 比 string 更好? [复制]

    这个问题在这里已经有答案了 重载解析倾向于将 视为某种基本类型 而不是某种容器 例如 include
  • 如何将 MATLAB 与 Eclipse 集成

    我是 OSLC 集成主题的新手 我心里有几个问题 如何知道工具是否支持 OSLC 我可以将 MATLAB 与 Eclipse 集成吗 1 OSLC配套工具 截至目前 只有少数工具支持开箱即用的 OSLC 您可能会通过检查他们的产品页面 或搜
  • 在spyder中无法获取ipython控制台

    我无法获得ipythonSpyder 中的控制台 它只提供一个python 口译员 菜单下的口译员 我在 Stackoverflow 上的其他几个人中看到过这个问题 但对所提供的解决方案并不满意 我正在运行 linux Mint 16 并通
  • 无法加载任何给定的库:[netty-tcnative-linux-x86_64,netty-tcnative]

    我已经在 tomcat 容器内部署了一个 Web 应用程序 并使用了 grpc netty 1 2 0 和 netty tcnative boringssl static jar 1 1 33 Fork26 当我打开调试日志时 它告诉我 j
  • 如何使用javascript更改div的背景图像?

    这是我的代码 div style text align center div class ghor div function call div
  • eclipse Juno 自定义工作台颜色

    有人知道如何在 eclipse Juno 4 2 中更改工作台视图 例如 Package Explorer 的颜色吗 我如何使用这个漂亮的新 CSS 样式功能 对于编辑器来说 它可以在 首选项 常规 外观 下使用 但我想要 需要将整个工作台
  • node.js 解析请求的 JSON

    我正在向 node js 发送带有以下请求的凭证 JSON 对象 credentials new Object credentials username username credentials password password ajax
  • 如何在python中求解多项式特征值?

    在我的Python代码中 我想解决多项式特征值问题 A0 lambda A1 lambda 2 A2 lambda 3 A3 0 where An是稠密矩阵 并且lambda是一个常数 在matlab中可以使用以下方法解决这个问题多义函数
  • 我在 groupby 上应用了 sum() ,我想对最后一列的值进行排序

    给定以下数据框 user ID product id amount 1 456 1 1 87 1 1 788 3 1 456 5 1 87 2 第一列是客户的 ID 第二列是他购买的产品的 ID 金额 表示当天购买的产品的数量 也考虑日期
  • Postgres 中的脏读

    我有一个长时间运行的函数 应该插入新行 如何查看该功能的进度 我认为脏读会起作用 所以我读了http www postgresql org docs 8 4 interactive sql set transaction html并提出以下
  • 我正在尝试运行 yargs 命令,但它不起作用

    我在跑步 node app js add 我的代码是 const yargs require yargs yargs command command add describe Adding command handler function
  • PHPMailer 添加地址()

    我不知道如何为 AddAddress PHPMailer 函数格式化数据 我需要将电子邮件发送给多个收件人 所以我尝试了 to email protected email protected email protected obj gt A
  • 如何将CSS应用于特定表的td?

    如何将CSS应用于一个特定表的td 排除网页中的所有其他表格 table class pure table fullWidth tbody tr class pure table odd td td tr tbody table
  • 反转实值索引网格

    OpenCV 的remap 使用实值索引网格通过双线性插值对图像中的值网格进行采样 并将样本网格作为新图像返回 准确地说 让 A an image X a grid of real valued X coords into the imag