【学习OpenCV4】重映射

本文分享内容来自图书《学习OpenCV 4:基于Python的算法实战》,该书内容如下:

1章 OpenCV快速入门;
第2章 图像读写模块imgcodecs;
第3章 核心库模块core;
第4章 图像处理模块imgproc(一);
第5章 图像处理模块imgproc(二);
第6章 可视化模块highgui;
第7章 视频处理模块videoio;
第8章 视频分析模块video;
第9章 照片处理模块photo;
第102D特征模块features2d;
第11章 相机标定与三维重建模块calib3d;
第12章 传统目标检测模块objdetect;
第13章 机器学习模块ml;
第14章 深度神经网络模块dnn

欢迎关注图书《深度学习计算机视觉实战》与《学习OpenCV4:基于Python的算法实战》。

在这里插入图片描述


重映射是将输入图像与输出图像的像素按照一定的对应关系进行映射变换,OpenCV中进行重映射的函数为remap,函数的定义如下:

dst = remap(src, map1, map2, interpolation, dst=None, borderMode=None, borderValue=None)

参数说明如下:
src,输入图像,需传入单通道8位整型图或者浮点型图;
map1,第一个map,对应(x,y)变化或者仅仅x值变化;
map2,第二个map,对应y值的变化;
interpolation,插值方式,由InterpolationFlags定义(见4.10节);
dst,输出图像(返回值);
borderMode,边界模式,由BorderTypes定义(见3.4.5节);
borderValue,当边界模式为BORDER_CONSTANT时的边界值。
本案例实现输入图像在水平方向的翻转,实现的案例代码如下:

import cv2
import numpy as np

img = cv2.imread("src.jpg", 0)
mapx = np.zeros_like(img, dtype=np.float32)
mapy = np.zeros_like(img, dtype=np.float32)

#水平翻转
for i in range(mapx.shape[1]):
    mapx[:, i:i+1] = mapx.shape[1] - i - 1

#垂直方向保持不变
for j in range(mapx.shape[0]):
    mapy[j:j+1, :] = j

#重映射
remap_x = cv2.remap(img, mapx, mapy, cv2.INTER_NEAREST)
cv2.imshow("src_img", img)
cv2.imshow("remap_x", remap_x)
cv2.waitKey(0)
cv2.destroyAllWindows()

水平翻转的结果如图5.11所示,其中左图为输入图像,右图为水平翻转的图像。
在这里插入图片描述

图5.11
如果想实现图像沿着水平和垂直方向都翻转,则可以修改对应的映射关系:

#水平翻转
for i in range(mapx.shape[1]):
    mapx[:, i:i+1] = mapx.shape[1] - i - 1

#垂直方向翻转
for j in range(mapx.shape[0]):
    mapy[j:j+1, :] = mapx.shape[0] - j - 1

#重映射
remap_img = cv2.remap(img, mapx, mapy, cv2.INTER_NEAREST)
cv2.imshow("src_img", img)
cv2.imshow("remap_x", remap_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

翻转的结果如图5.12所示,其中左图为输入图像,右图为翻转的图像。
在这里插入图片描述

图5.12

猜你喜欢

转载自blog.csdn.net/lxiao428/article/details/123140433
今日推荐