opencv remap matlab,如何使用OpenCV的remap函数?

opencv remap matlab,如何使用OpenCV的remap函数?这只是对文件的一个简单的误解,我不怪你——我也花了几次摸索才明白。文档很清楚,但是这个函数可能没有按您预期的方式工作;事实上,它在与我最初预期相反的方向工作。remap()没有做的是获取源图像的坐标,变换点,然后插值。remap()所做的是,对于目的地图像中的每个像素,查找它来自源图像中的位置,然后分配一个插值值。它需要这样工作,因为为了插值,它需要查看每个像素处源图像周围的值。让我扩展一下(可能…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

这只是对文件的一个简单的误解,我不怪你——我也花了几次摸索才明白。文档很清楚,但是这个函数可能没有按您预期的方式工作;事实上,它在与我最初预期相反的方向工作。

remap()没有做的是获取源图像的坐标,变换点,然后插值。remap()所做的是,对于目的地图像中的每个像素,查找它来自源图像中的位置,然后分配一个插值值。它需要这样工作,因为为了插值,它需要查看每个像素处源图像周围的值。让我扩展一下(可能会重复一下,但不要误会)。map1 – The first map of either (x,y) points or just x values having the type CV_16SC2 , CV_32FC1 , or CV_32FC2 . See convertMaps() for details on converting a floating point representation to fixed-point for speed.

map2 – The second map of y values having the type CV_16UC1 , CV_32FC1 , or none (empty map if map1 is (x,y) points), respectively.

这里关于map1的“Thefirstmap of…”的措辞有些误导。记住,这些是图像从映射的坐标……这些点从map_x(x, y), map_y(x, y)的src映射,然后放在x, y的dst中。它们应该和你想把它们扭曲成的图像形状一样。请注意文档中显示的公式:dst(x,y) = src(map_x(x,y),map_y(x,y))

这里map_x(x, y)在x, y给定的行和列上查找map_x。然后在这些点对图像进行求值。它查找src中x, y的映射坐标,然后将该值赋给dst中的x, y。如果你盯着它看够久,它就开始有意义了。在新目标图像中的像素(0, 0)处,我查看map_x和map_y,它们告诉我源图像中相应像素的位置,然后通过查看源图像中的接近值,可以在目标图像中的(0, 0)处分配插值。这就是remap()以这种方式工作的基本原因;它需要知道像素从哪里来,以便它可以看到要插值的相邻像素。

做作的小例子img = np.uint8(np.random.rand(8, 8)*255)

#array([[230, 45, 153, 233, 172, 153, 46, 29],

# [172, 209, 186, 30, 197, 30, 251, 200],

# [175, 253, 207, 71, 252, 60, 155, 124],

# [114, 154, 121, 153, 159, 224, 146, 61],

# [ 6, 251, 253, 123, 200, 230, 36, 85],

# [ 10, 215, 38, 5, 119, 87, 8, 249],

# [ 2, 2, 242, 119, 114, 98, 182, 219],

# [168, 91, 224, 73, 159, 55, 254, 214]], dtype=uint8)

map_y = np.array([[0, 1], [2, 3]], dtype=np.float32)

map_x = np.array([[5, 6], [7, 10]], dtype=np.float32)

mapped_img = cv2.remap(img, map_x, map_y, cv2.INTER_LINEAR)

#array([[153, 251],

# [124, 0]], dtype=uint8)

那这里发生了什么?记住,这些是img的索引,将映射到它们所在的行和列。在这种情况下,最容易检查矩阵:map_y

=====

0 1

2 3

map_x

=====

5 6

7 10

因此(0,0)处的目标图像与map_y(0, 0), map_x(0, 0) = 0, 5处的源图像具有相同的值,第0行和第5列处的源图像是153。请注意,在目标图像中mapped_img[0, 0] = 153。这里没有插值,因为我的地图坐标是精确的整数。此外,我还包含了一个越界索引(map_x[1, 1] = 10,它大于图像宽度),注意,当它越界时,它只是被赋值为0。

完整用例示例

下面是一个完整的代码示例,使用地面真值单应,手动扭曲像素位置,然后使用remap()从转换点映射图像。注意,这里我的单应式将true_dst转换为src。因此,我建立了一个任意多个点的集合,然后通过用单应变换计算这些点在源图像中的位置。然后使用remap()查找源图像中的这些点,并将它们映射到目标图像中。import numpy as np

import cv2

# read images

true_dst = cv2.imread(“img1.png”)

src = cv2.imread(“img2.png”)

# ground truth homography from true_dst to src

H = np.array([

[8.7976964e-01, 3.1245438e-01, -3.9430589e+01],

[-1.8389418e-01, 9.3847198e-01, 1.5315784e+02],

[1.9641425e-04, -1.6015275e-05, 1.0000000e+00]])

# create indices of the destination image and linearize them

h, w = true_dst.shape[:2]

indy, indx = np.indices((h, w), dtype=np.float32)

lin_homg_ind = np.array([indx.ravel(), indy.ravel(), np.ones_like(indx).ravel()])

# warp the coordinates of src to those of true_dst

map_ind = H.dot(lin_homg_ind)

map_x, map_y = map_ind[:-1]/map_ind[-1] # ensure homogeneity

map_x = map_x.reshape(h, w).astype(np.float32)

map_y = map_y.reshape(h, w).astype(np.float32)

# remap!

dst = cv2.remap(src, map_x, map_y, cv2.INTER_LINEAR)

blended = cv2.addWeighted(true_dst, 0.5, dst, 0.5, 0)

cv2.imshow(‘blended.png’, blended)

cv2.waitKey()

a16c803d249f413e2fd5397180a47b01.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230612.html原文链接:https://javaforall.net

(0)
上一篇 2025年6月19日 下午12:43
下一篇 2025年6月19日 下午1:15


相关推荐

  • mybatis的collection属性_安全带的使用方法和步骤

    mybatis的collection属性_安全带的使用方法和步骤问题1==>n问题选项//问题实体类publicclassQuestion{ private Stringid;//ID private Stringcontent;//问题 private Stringtype;//问题类型1:单选,2:多选,3:问答 private Integersort;//排序 privateList<Questi…

    2022年8月22日
    6
  • python中用turtle画一个圆形(pythonturtle教程)

    最近发现一个很有意思的画图的python库,叫做turtle,这里先说下用turtle这个库来实现用正方形画圆的思路。每次都用乌龟(turtle)来画出一个正方形,然后通过旋转3°后,继续画一样的正方形,在通过120次循环后就实现了完整的圆,这里当然也可以用其他的角度和次数,只要能完成360度就可以了。先看完成的图形和代码。代码如下:importturtlewindow=turtle.Scr…

    2022年4月14日
    352
  • java和html_如何区别html和html5

    java和html_如何区别html和html5JSP和HTMLJSP代表JavaServerPages;它主要用于开发动态网页,文件的扩展名为.jsp。JSP的主要优点是程序员可以在HTML中插入Java代码;使用JSP标签插入Java代码。程序员可以编写<%标签来启动Java代码,并在Java代码的末尾写入%>标签。JSP允许在HTML文件中插入Java代码HTML代表超文本标记语言。它是众所周知的用于开发网页的标记语言,有助于构建网页结构。JSP和HTML之间的区别1、采用的技术不同HTML是客户端技术,提供

    2025年8月13日
    4
  • 无废话ExtJs 入门教程一[学习方法]

    无废话ExtJs 入门教程一[学习方法]无废话 ExtJs 入门教程一 学习方法 extjs 技术交流 欢迎加群 本教程的制作是基于我从零开始学习 ExtJs 到正式在项目中应用的整个学习过程和方法 其中肯定会有许多不足之处 还请大家多多批评指正 很多书籍和网上的教程大多是从 API 与 ExtJs 的机制开始讲解的 而在我的学习过程中发现 没有接触过 ExtJs 或对 javascript 了解很少的同事 在看到前面几章的

    2026年3月17日
    2
  • 什么是债券久期[通俗易懂]

    什么是债券久期[通俗易懂]在做债券的投资分析中经常出现的一个词汇——债券久期,之前更多地是专注于开发,并不明白数字背后的业务含义,今天特意梳理下并做个记录。百度百科的解释:久期也称持续期,是1938年由F.R.Macaula

    2022年8月3日
    5
  • 网络流量分析netflow

    网络流量分析netflow前言  随着宽带互联网在中国的迅速发展,全国各大电信运营商的网络规模都在不断扩张,网络结构日渐复杂,网络业务日趋丰富,网络流量高速增长。电信运营商需要通过可靠、有效的网络业务流量监测系统对其网络以及网络所承载的各类业务进行及时、准确的流量和流向分析,进而挖掘网络资源潜力,控制网络互联成本,并为网络规划、优化调整和业务发展提供基础依据。  目前国内电信运营商已建的网络管理系统所能实现

    2022年4月29日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号