热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【OpenCV例程300篇】249.图像的重映射(cv2.remap)

『youcans的OpenCV例程300篇-总目录』【youcans的OpenCV例程300篇】249.图像的重映射(cv.remap)重映射是指从一



『youcans 的 OpenCV 例程300篇 - 总目录』




【youcans 的 OpenCV 例程300篇】249. 图像的重映射(cv.remap)

重映射是指从一个图像中的位置获取像素,将其重新映射,定位到目标图像的指定位置。

重映射可以实现图像的变形、扭曲、反转等操作,实现图像数据的增强,提升深度模型的泛化能力。

与前面介绍的仿射变换、透视变换函数和方法相比,重映射可以按用户设定的变换函数对图像的像素位置进行变换。既可以实现翻转、变形、扭曲等操作,也可以自定义变换函数。

重映射经常应用于视频图像的重建。映射函数是动态变化的,而且往往是由复杂算法实时计算得到的,视频播放或动态显示窗口实时调用重映射函数,就可以动态加载目标的位置和形状。这种场景用仿射变换实现就会很困难,而用重映射函数处理则非常方便。

像素的整数坐标进行函数映射后,映射的输出值可能不是整数,就需要进行插值运算。

OpenCV 提供了函数 cv2.remap 用于实现图像的重映射。

函数 cv2.remap 按照以下映射公式进行变换:





d s t ( x , y ) = s r c ( m a
p


x
( x , y ) , m a
p


y
( x , y ) )



dst(x,y) = src(map_x(x,y), map_y(x,y))

dst(x,y)=src(mapx(x,y),mapy(x,y))

也就是说,mapx 表示原图像中的列号,mapy 表示原图像中的行号。输出图像中像素点 (x,y) 的像素值,等于原图像中点 (mapx,mapy) 的像素值。

函数说明:

cv.remap(src, map1, map2, interpolation[, dst=None, borderMode=BORDER_CONSTANT, borderValue=Scalar()]) → dst

参数说明:

  • src:输入图像
  • dst:输出图像,大小与 map1 相同,类型与输入图像 src 相同
  • map1:浮点数,对像素 (x,y) 的映射,或仅对 x 值的映射,数据类型为 CV_16SC2 , CV_32FC1 或 CV_32FC2
  • map2: 浮点数,y 值的映射
  • interpolation:插值方法
    • cv.INTER_NEAREST:最近邻插值方法
    • cv.INTER_LINEAR:双线性插值方法
    • cv.INTER_CUBIC:双三次样条插值方法
    • cv.INTER_LANCZOS4:8*8 邻域上的 Lanczos 插值
    • cv.INTER_MAX:mask for interpolation codes
    • cv.WARP_FILL_OUTLIERS:标志,填充所有目标图像像素
    • cv.WARP_INVERSE_MAP:标志,逆变换
  • borderMode:边界扩展类型
  • borderValue: 当边界扩展模式为 BORDER_CONSTANT 时,以常数填充边界,默认值为 0

注意事项:

  1. 重映射目标图像中像素的位置变换,像素值不变。
  2. map1 可以是对 (x,y) 的映射,此时 map2 为空;map1 也可以是只对 x 值的映射,此时 map2 为对 y 值的映射。



A.47: 图像重映射实现仿射变换

# # A.47 图像重映射实现仿射变换
# img = cv2.imread("../images/keyboard01.png", 1) # 读取图像
img = cv2.imread("../images/sign04.png", 1) # 读取图像
height, width = img.shape[:2] # (540, 400)
mapx = np.array([[i for i in range(width)] for j in range(height)], dtype=np.float32)
mapy = np.array([[j for i in range(width)] for j in range(height)], dtype=np.float32)
dst1 = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR) # 复制
mapx = np.array([[i*1.5 for i in range(width)] for j in range(height)], dtype=np.float32)
mapy = np.array([[j*1.5 for i in range(width)] for j in range(height)], dtype=np.float32)
dst2 = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR) # 尺寸缩放
mapx = np.array([[i for i in range(width)] for j in range(height)], dtype=np.float32) # 行不变
mapy = np.array([[j for i in range(width)] for j in range(height-1, -1, -1)], dtype=np.float32)
dst3 = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR) # 上下翻转,x 不变 y 翻转
mapx = np.array([[i for i in range(width-1, -1, -1)] for j in range(height)], dtype=np.float32)
mapy = np.array([[j for i in range(width)] for j in range(height)], dtype=np.float32)
dst4 = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR) # 左右翻转,x 翻转 y 不变
mapx = np.array([[i for i in range(width-1, -1, -1)] for j in range(height)], dtype=np.float32)
mapy = np.array([[j for i in range(width)] for j in range(height-1, -1, -1)], dtype=np.float32)
dst5 = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR) # 水平和垂直翻转,x 翻转 y 翻转
print(img.shape, mapx.shape, mapy.shape, dst1.shape)
plt.figure(figsize=(9,6))
plt.subplot(231), plt.title("origin"), plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.subplot(232), plt.title("copy"), plt.axis('off')
plt.imshow(cv2.cvtColor(dst1, cv2.COLOR_BGR2RGB))
plt.subplot(233), plt.title("resize"), plt.axis('off')
plt.imshow(cv2.cvtColor(dst2, cv2.COLOR_BGR2RGB))
plt.subplot(234), plt.title("flip vertical"), plt.axis('off')
plt.imshow(cv2.cvtColor(dst3, cv2.COLOR_BGR2RGB))
plt.subplot(235), plt.title("flip horizontal"), plt.axis('off')
plt.imshow(cv2.cvtColor(dst4, cv2.COLOR_BGR2RGB))
plt.subplot(236), plt.title("flip horizontal"), plt.axis('off')
plt.imshow(cv2.cvtColor(dst5, cv2.COLOR_BGR2RGB))
plt.tight_layout()
plt.show()

在这里插入图片描述


【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/127573293)
Copyright 2022 youcans, XUPT
Crated:2022-10-28







推荐阅读
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
author-avatar
潇潇-77
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有