OpenCV 重映射插值错误?

2024-01-07

我正在使用 opencv 重映射函数将图像映射到另一个坐标系。 然而,我的初步测试表明插值存在一些问题。 在这里,我给出了一个简单的示例,即图像的常量 0.1 像素偏移,除了位置 [50,50] 之外,其他位置均为 0。

import cv2
import numpy as np

prvs = np.zeros((100,80), dtype=np.float32)
prvs[50:51, 50:51] = 1.

grid_x, grid_y = np.meshgrid(np.arange(prvs.shape[1]), np.arange(prvs.shape[0]))
grid_y = grid_y.astype(np.float32)
grid_x = grid_x.astype(np.float32) + 0.1

prvs_remapped = cv2.remap(prvs, grid_x, grid_y, interpolation=cv2.INTER_LINEAR)

print(prvs_remapped[50,50])
print(prvs_remapped[50,49])

gives

0.90625
0.09375

然而,考虑到线性插值方法,我期望 0.9 和 0.1。我做错了什么还是这是一些数字问题? 有没有更精确的重映射算法?

Thanks.


不错的收获。我认为您的期望是正确的,例如np.interp giving 0.1 and 0.9 values.

让我们绘制一个金字塔(插值到 49:51 的方形像素范围内):

import numpy as np
import cv2
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

prvs = np.zeros((100,80), dtype=np.float32)
prvs[50:51, 50:51] = 1

lin = np.linspace(49,51,200)
grid_x,grid_y = np.meshgrid(lin,lin)
grid_x = grid_x.astype(np.float32)
grid_y = grid_y.astype(np.float32)
prvs_zoommapped = cv2.remap(prvs, grid_x, grid_y, interpolation=cv2.INTER_LINEAR)

fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.plot_surface(grid_x,grid_y,prvs_zoommapped,cmap='viridis')
plt.show()

注意到什么了吗?绘图网格为 200x200,金字塔上有非常明显的台阶。让我们看一下结果的横截面:

fig,ax = plt.subplots()
ax.plot(prvs_zoommapped[100,:],'x-')
ax.grid('on')
plt.show()

正如您所看到的,结果是一个分段常数函数,即输出中存在巨大的离散化误差。准确地说,我们看到的步骤是0.03125 == 1/32在结果中。

我的怀疑是cv2.remap并不是用于子像素操作,而是用于从一个网格到另一个网格的更大规模映射。另一种选择是牺牲内部精度来提高性能。不管怎样,你都不会发疯:你应该看到0.1 and 0.9作为精确(双)线性插值的结果。

如果您由于其他任务而没有致力于 openCV,则可以使用各种位来执行此映射(即 2d 插值)scipy.interpolate https://docs.scipy.org/doc/scipy/reference/interpolate.html,即它的部分是为二维插值而设计的 https://stackoverflow.com/q/37872171/5067311。对于规则网格上线性插值的特殊情况,scipy.interpolate.RegularGridInterpolator https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.RegularGridInterpolator.html#scipy.interpolate.RegularGridInterpolator或者类似的东西可能是合适的。

或者甚至更好(但我还没有使用这个子模块):scipy.ndimage.map_coordinates https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.map_coordinates.html#scipy.ndimage.map_coordinates看起来正是您正在寻找的:

from scipy import ndimage
ndimage.map_coordinates(prvs, [[50.1, 49.1], [50, 50]], order=1)
# output: array([ 0.89999998,  0.1       ], dtype=float32)

应用于金字塔的例子:

import numpy as np
import cv2
from scipy import ndimage
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

prvs = np.zeros((100,80), dtype=np.float32)
prvs[50:51, 50:51] = 1

lin = np.linspace(49,51,200)
grid_x,grid_y = np.meshgrid(lin,lin)
prvs_zoommapped = ndimage.map_coordinates(prvs, [grid_x, grid_y], order=1)

fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.plot_surface(grid_x,grid_y,prvs_zoommapped,cmap='viridis')
plt.show()

好多了。

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

OpenCV 重映射插值错误? 的相关文章

随机推荐

  • MPMoviePlayerPlaybackDidFinishNotification 在不应调用时被调用

    根据 Apple 的 MPMoviePlayerController 文档 MPMoviePlayerPlaybackDidFinishNotification 如果电影播放器 以全屏模式显示并且用户点击 完成 按钮 则不会发送此通知 在我
  • Servlet Faces Servlet 不可用(richfaces 4、tomcat 7)

    我正在尝试我的第一个 richfaces 项目 因此 我创建了一个新的 JSF 项目 使用 JBoss Tools eclipse 插件 并选择了以下选项 JSF2 0 JSFKickStartWithoutLibs 我没有对生成的示例进行
  • 如何显示图片?

    我在调用图片进行查看时遇到问题 在我的应用程序中 他们单击按钮后 我想将他们带到一个新页面 其中将显示图片并在其下方显示一些文本 对于这个例子 如果狗位于页面顶部 那么我想要一张图片 然后在它下面说我想要诸如品种和品种成本之类的东西 谁能帮
  • 我怎样才能修复“&需要左值”[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 所以 我创建了一个项目并复制本教程 https github com microsoft DirectX Graphic
  • 在列表中使用两种单独的字符串类型

    好的 对于我的 C 编程课程 我正在制作一款冒险游戏 我想我明白如何做大部分事情 但我在建立 世界 时遇到了困难 我有一个面向世界的课程 World cs 我开始为每个房间创建一个列表 然而 我很困惑为每个房间添加名称和描述 例如 如果Li
  • 可见命令出现在上下文菜单中的时间

    我正在尝试使用 menuContribution 中的 visibleWhen 表达式配置上下文菜单中命令的可见性 我想做的是仅当您执行以下操作时才使该命令在上下文菜单中可见 在资源视图 或包视图 中右键单击某些文件类型 资源 右键单击已打
  • 使用 tkinter 创建椭圆形的流畅运动

    我正在尝试使用 tkinter 创建 Connect Four 一旦圆盘被放置在特定的柱中 我希望它以流体运动下降到柱的底部 我尝试过使用 Canvas 类的移动命令 但我不确定我是否使用错误 或者也许我最好在每次迭代中删除并重新绘制椭圆形
  • 仅对带有 Pandas 的字符串列应用转换,忽略数值数据

    所以 我有一个相当大的数据框 有 85 列和近 90 000 行 我想在所有数据框中使用 str lower 但是 有几列包含数字数据 有一个简单的解决方案吗 gt df A B C 0 10 John Dog 1 12 Jack Cat
  • 使用 Vue.JS 删除多维数组内的值

    早上好 我有以下表格 当您单击 新项目 按钮时 一个新的文本字段将添加到相关部分 如果单击 新部分 按钮 则会创建一个新部分 当您单击该部分右上角的 X 时 该部分将成功删除 但是 我正在尝试实现每个 添加 文本字段下方 右侧 的 X 我想
  • Python:按日期对列表进行排序?

    是否可以按日期对列表进行排序 它用于流程图 因此必须以较小列表对的列表格式进行组织 我希望能够按日期排序 2014 5 29 19 2014 5 28 16 2014 5 30 20 2014 5 23 16 2014 5 22 1225
  • 如何在 Web 应用程序中实现 REST?

    我想知道如何在我的 Web 应用程序中实现 REST 我想创建一个基于此服务的网络应用程序 但我不知道该怎么做 现在 我使用 J2EE 和 Tomcat 这些技术应该考虑哪些因素 EDIT 抱歉 我的意思是 RESTful 服务 REST
  • CSS 中的动态气泡

    I m trying to make something like this 我想使用纯CSS Bootstrap v3 已加载 我已经非常接近类似的事情了 bubble position relative left 15px paddin
  • 如何为 @Html.ActionLink cshtml 页面中新打开的选项卡的标题设置名称

    我当前的代码在Index cshtml page Html ActionLinks Html ActionLink objList Name Name ControllerName new Id objList Id new target
  • 在 web.xml 中使用 JSF EL 表达式

    我可以在 web xml 中使用 EL 表达式吗 像这样 Web xml
  • 如果父类没有实现可序列化,则序列化子类?

    public class Employee2 extends Employee1 public class Employee1 extends Employee0 public class Employee0 现在我序列化 Employee
  • 如何删除默认的 ASP.NET Core Identity 端点?

    假设我想编写自己的登录 注销端点及其视图 但由于某种原因 我正在努力删除现有端点 每当我删除可能与这些端点相关的内容时 它们就会重新创建自己并返回默认视图 基本上我想删除尽可能多的从 ASP NET Core Identity 生成的默认端
  • 如何让 Android 设备振动?不同频率?

    我写了一个Android应用程序 现在 我想让设备在发生特定操作时振动 我怎样才能做到这一点 Try import android os Vibrator Vibrator v Vibrator getSystemService Conte
  • Laravel 将所有请求重定向到 HTTPS

    我们的整个网站将通过 https 提供服务 我的每条路线都有 https 但是 如果他们尝试通过 http 进行访问 我该如何将他们重定向到 https Route group array https function all of our
  • 如何从(非网络)Python 客户端访问经过身份验证的 Google App Engine 服务?

    我有一个 Google App Engine 应用程序 http mylovelyapp appspot com http mylovelyapp appspot com 它有一个页面 mylovelypage 目前 该页面只是self r
  • OpenCV 重映射插值错误?

    我正在使用 opencv 重映射函数将图像映射到另一个坐标系 然而 我的初步测试表明插值存在一些问题 在这里 我给出了一个简单的示例 即图像的常量 0 1 像素偏移 除了位置 50 50 之外 其他位置均为 0 import cv2 imp