Opencv 学习笔记:remap 实现图像映射(缩放 / 对称 / 旋转)

图像映射(remap)是 OpenCV 中灵活调整图像像素位置的核心操作,通过自定义像素坐标映射规则,可实现图像缩放、对称、旋转等效果。本文用极简代码演示 remap 的基础用法,新手可快速掌握自定义映射逻辑。

核心代码实现

python 复制代码
import cv2 as cv
import numpy as np

# 1. 读取图像并校验
src = cv.imread(".\image\1.bmp")
if src is None:
    print('could not load image')
    exit()
rows, cols, channels = src.shape  # 获取图像尺寸:行(高)、列(宽)、通道数

# 2. 创建映射矩阵(float32类型,与原图尺寸一致)
img_x = np.zeros((rows, cols), np.float32)  # x轴(列)映射矩阵
img_y = np.zeros((rows, cols), np.float32)  # y轴(行)映射矩阵

# 3. 遍历每个像素,定义映射规则(按需注释/启用不同效果)
for y in range(rows):
    for x in range(cols):
        # 效果1:缩小一半(需注释其他效果)
        # img_x[y, x] = 2 * (x - cols * 0.25)
        # img_y[y, x] = 2 * (y - rows * 0.25)
        
        # 效果2:左右对称(镜像)
        # img_x[y, x] = cols - x - 1
        # img_y[y, x] = y
        
        # 效果3:上下对称
        # img_x[y, x] = x
        # img_y[y, x] = rows - y - 1
        
        # 效果4:中心旋转180°
        img_x[y, x] = cols - x - 1
        img_y[y, x] = rows - y - 1

# 4. 执行图像映射(线性插值,保证过渡平滑)
dst = cv.remap(src, img_x, img_y, cv.INTER_LINEAR)

# 5. 显示原图与映射结果
cv.imshow('outimage1(原图)', src)
cv.imshow('outimage2(映射后)', dst)

cv.waitKeyEx(0)
cv.destroyAllWindows()

关键知识点解析

1. remap 核心逻辑

  • 映射矩阵 :img_x[y,x]表示目标图像 (y,x) 位置的像素,来源于原图的img_x[y,x]列;img_y[y,x]对应原图的行;
  • 数据类型 :映射矩阵必须为float32,否则会导致映射失效;
  • 插值方式 :cv.INTER_LINEAR(线性插值)是默认最优选择,保证映射后图像无锯齿,也可选用cv.INTER_NEAREST(最近邻插值,速度更快但效果粗糙)。

2. 常用映射规则拆解

效果 映射公式 原理说明
左右对称 img_x=cols-x-1; img_y=y 列坐标取反,行坐标不变
上下对称 img_x=x; img_y=rows-y-1 行坐标取反,列坐标不变
180° 旋转 img_x=cols-x-1; img_y=rows-y-1 行列坐标同时取反
缩小一半 img_x=2*(x-cols*0.25) 坐标缩放 + 偏移,避免图像偏移

3. 避坑与优化技巧

  • 坐标偏移 :缩放映射时需添加偏移量(如cols*0.25),否则图像会偏离画布;

  • 遍历效率 :双层 for 循环效率较低,可改用np.meshgrid生成映射矩阵,大幅提升速度:

    python

    运行

    复制代码
    x, y = np.meshgrid(np.arange(cols), np.arange(rows))
    img_x = cols - x - 1  # 直接批量赋值,替代循环
    img_y = y
  • 边界处理:映射后超出原图范围的像素会填充为 0(黑色),可通过调整映射公式避免。

总结

  1. remap 的核心是自定义img_x/img_y映射矩阵,定义目标像素的原图坐标来源;
  2. 映射矩阵必须为 float32 类型,插值方式优先选 INTER_LINEAR;
  3. 常用对称 / 旋转效果可通过行列坐标取反实现,缩放需配合偏移量避免图像偏移。
相关推荐
一隅论数智4 小时前
给AI找对“富矿“:本体协同的六大应用模式与落地战法
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
夏天的清晨4 小时前
C++入门学习
开发语言·c++·学习
传奇开心果编程4 小时前
【ArkUI进阶练中学】第18课:Agent亲和架构与应用智能化改造
学习·ui·华为·harmonyos
代码山河4 小时前
Java的前世今生:从Oak语言到Java 23的发展史
java·学习·架构·教程·面向对象·项目
一木 之林4 小时前
《OpenAI库基础学习总结:Client 初始化、流式输出 delta 拼接与多轮历史 messages 全流程拆解》
人工智能·学习·计算机视觉·stable diffusion·aigc
m4Rk_4 小时前
【论文阅读】Agent 记忆机制(90):HyperMem——用超图建模长期记忆中的高阶关联
论文阅读·人工智能·学习·开源·github
糖炒栗子03265 小时前
深度学习笔记-FCN
笔记
星恒随风5 小时前
Linux开发工具详解(二):Git版本控制、GitHub协作与GDB调试实战
linux·笔记·git·学习·github
by2099915 小时前
学会使用std::string类,并理解其内部是如何管理字符串的详细阐述(上)
c++·笔记·字符串·类和对象·string
青柠之夏cc16 小时前
AI与教育:个性化学习助手让“因材施教“成为现实,但代价是隐私?
人工智能·学习