IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【OpenCV 例程300篇】249. 图像的重映射(cv2.remap) -> 正文阅读

[人工智能]【OpenCV 例程300篇】249. 图像的重映射(cv2.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

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:56:46  更:2022-10-31 11:58:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:17:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码