[OpenCV] cv.remap() 重映射学习笔记/map1 map2易混点

文章目录

  • 一、背景
  • 二、Notes
    • (一)更新几个小例子方面理解remap
      • 1. 利用remap 进行 copy
      • 2.进行翻转

学习remap的时候发现map1和map2的参数跟我的直观理解略有差别,在次记录一下。

一、背景

把一幅图像内的像素点放置到另外一幅图像内的指定位置,这个过程称为重映射。OpenCV 提供了多种重映射方式,但是我们有时会希望使用自定义的方式来完成重映射。OpenCV 内的重映射函数 cv2.remap()提供了更方便、更自由的映射方式,其语法格式如下:dst=cv2.remap(src,map1,map2,interpolation[,borderMode[,borderValue]])式中:
● dst 代表目标图像,它和 src 具有相同的大小和类型。
● src 代表原始图像。
● map1 参数有两种可能的值:
1 表示(x,y)点的一个映射。
2 表示 CV_16SC2 ,CV_32FC1的 x 值。
● map2 参数有两种可能的值:
1 空。
2 表示 CV_16SC2 ,CV_32FC1的y 值。
● Interpolation 代表插值方式,这里不支持 INTER_AREA 方法。具体值参见表 5-1。
● borderMode 代表边界模式。当该值为 BORDER_TRANSPARENT 时,表示目标图像内的对应源图像内奇异点(outliers)的像素不会被修改。
● borderValue 代表边界值,该值默认为 0。

5.5.1映射参数的理解
重映射通过修改像素点的位置得到一幅新图像。在构建新图像时,需要确定新图像中每.
个像素点在原始图像中的位置。因此,映射函数的作用是查找新图像像素在原始图像内的位
置。该过程是将新图像像素映射到原始图像的过程,因此被称为反向映射。在函数
cv2.remap()中,参数map1和参数map2用来说明反向映射,map1针对的是坐标x,
map2针对的是坐标y。
需要说明的是,map1和map2的值都是浮点数。因此,目标图像可以映射回一个非整
数的值,这意味着目标图像可以「反向映射」到原始图像中两个像素点之间的位置(当 然,
该位置是不存在像素值的)。这时,可以采用不同的方法实现插值,函数中的interpolation 参
数可以控制插值方式。正是由于参数map1和参数map2的值是浮点数,所以通过函数
cv2.remamp () 所能实现的映射关系变得更加随意,可以通过自定义映射参数实现不同形式
的映射。

以上内容摘自《OpenCV轻松入门》

阅读完这一段,我从直觉上认为mapx应该控制x,mapy应该控制y。

试了一下

import numpy as np
import cv2 as cv

img = np.random.randint(0, 256, size=[4, 5], dtype=np.uint8)
rows, cols = img.shape[0:2]
mapx = np.ones(img.shape, np.float32) * 3;
mapy = np.ones(img.shape, np.float32) * 0;
rst = cv.remap(img, mapx, mapy, cv.INTER_LINEAR)

运行结果:
[OpenCV] cv.remap() 重映射学习笔记/map1 map2易混点_第1张图片

从结果上看,是mapx控制了y,mapy控制了x?

二、Notes

照例,先阅读官方文档
[OpenCV] cv.remap() 重映射学习笔记/map1 map2易混点_第2张图片

阅读官方文档是会有收获的:Due to current implementation limitations the size of an input and output images should be less than 32767x32767.

由于当前方案的限制,remap最大只支持32767*32767.

阅读了官方文档仍然没有得到答案,
又去翻了翻代码;
突然一拍脑袋,
这x=1可不就是确定的一列吗?
mapx当然管列号了啊…

矩阵、数组的行列表达方式用惯了,
形成了思维定式,
反思反思

综上,简单来讲:

map1 代表的是在原位置的列号,map2 是行号

(一)更新几个小例子方面理解remap

1. 利用remap 进行 copy

import numpy as np
import cv2 as cv

img = np.random.randint(0, 256, size=[4, 5], dtype=np.uint8)
rows, cols = img.shape[0:2]
mapx=np.array([[i for i in range(5)] for j in range(4)],dtype=np.float32)
mapy=np.array([[j for i in range(5)] for j in range(4)],dtype=np.float32)
rst = cv.remap(img, mapx, mapy, cv.INTER_LINEAR)

效果:
[OpenCV] cv.remap() 重映射学习笔记/map1 map2易混点_第3张图片
[OpenCV] cv.remap() 重映射学习笔记/map1 map2易混点_第4张图片
复制成功

2.进行翻转

这里以上下翻转为例

img = np.random.randint(0, 256, size=[4, 5], dtype=np.uint8)
rows, cols = img.shape[0:2]
mapx=np.array([[i for i in range(5)] for j in range(4)],dtype=np.float32)
mapy=np.array([[j for i in range(5)] for j in range(3,-1,-1)],dtype=np.float32)
rst = cv.remap(img, mapx, mapy, cv.INTER_LINEAR)

[OpenCV] cv.remap() 重映射学习笔记/map1 map2易混点_第5张图片

做了这两个小练习,我已经好了,你呢~(手动滑稽

你可能感兴趣的:(OpenCV,Note,python,opencv,深度学习,人工智能,机器学习)