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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • unity3d教程视频_unity3d零基础自学教程

    unity3d教程视频_unity3d零基础自学教程Unity3D游戏开发知识系列图                        1、Unity3d基础操作说明:这部分课程是帮助掌握Unity基础的操作,为阶段的学习打下基础1)Unity3D初级课程之新手入门   课程地址:http://www.taikr.com/course/4292、NGUI3、Pl

    2022年9月19日
    0
  • ITDSD- 3.分布式工程学综述

    ITDSD- 3.分布式工程学综述英文版地址:ITDSD-3.OverviewofDistributedEngineeringSunshuo(sun.shuo@aliyun.com)导论这是关于分布式架构新手入门的第三篇文章。这一篇文章主要简要的介绍分布式工程学在理论上的基本概念,历史和现状,以及未来发展方向。让大家能够了解为什么学习分布式工程学。分布式工程学在计算机科学中的地位,以及分布式工程学要解决的问…

    2022年5月31日
    24
  • mysql语句截取字符串_mysql分割字符串split

    mysql语句截取字符串_mysql分割字符串splitMySQL字符串截取相关函数:1、从左开始截取字符串left(str,length)说明:left(被截取字段,截取长度)例:selectleft(content,200)asabstractfrommy_content_t2、从右开始截取字符串right(str,length)说明:right(被截取字段,截取长度)例:selectright(content,200)asa…

    2022年10月2日
    0
  • Mybatis中的resultMap和resultType区别

    Mybatis中的resultMap和resultType区别基本映射:(resultType)使用resultType进行输出映射,只有查询出来的列名和实体类中的属性名一致,该列才可以映射成功。(数据库,实体,查询字段,这些全部都得一一对应)高级映射:(resultMap)如果查询出来的列名和实体类的属性名不一致,通过定义一个resultMap对列名和实体类属性名之间作一个映射关系。(高级映射,字段名称可以不一致,通过映射来实现…

    2022年10月27日
    0
  • Java虚拟机:对象创建过程与类加载机制、双亲委派模型

    Java虚拟机:对象创建过程与类加载机制、双亲委派模型

    2021年10月5日
    39
  • HTTPClient和CloseableHttpClient

    使用HttpClient发送请求的一般步骤(1)创建HttpClient对象。(2)创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。(3)如果需要发送请求参数,可调用HttpGet同的setParams(HetpParamsparams)方法来添加请求参数;对于HttpPost对象而言,可调…

    2022年4月9日
    268

发表回复

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

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