学习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

最低0.47元/天 解锁文章
354

被折叠的 条评论
为什么被折叠?



