《OpenCV轻松入门:面向Python》读书笔记
作者:李立宗
出版社:电子工业出版社
出版时间:2019-05
第5章 几何变换
5.5 重映射
1)定义
把一幅图像内的像素点放置到另外一幅图像内的指定位置,这个过程称为重映射。OpenCV提供了多种重映射方式,但是我们有时会希望使用自定义的方式来完成重映射。
2)函数
OpenCV内的重映射函数cv2.remap()提供了更方便、更自由的映射方式,其语法格式如下:
dst = cv2.remap( src, map1, map2, interpolation[, borderMode[, borderValue]] )
式中:
- dst代表目标图像,
它和src具有相同的大小和类型。 - src代表原始图像。
- map1参数有两种可能的值:
表示(x, y)点的一个映射。
表示CV_16SC2 , CV_32FC1, CV_32FC2类型(x, y)点的x值。 - map2参数同样有两种可能的值:
当map1表示(x, y)时,该值为空。
当map1表示(x, y)点的x值时,该值是CV_16UC1, CV_32FC1类型(x, y)点的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()所能实现的映射关系变得更加随意,可以通过自定义映射参数实现不同形式的映射。 - 需要注意的是,函数cv2.remap()中参数map1指代的是像素点所在位置的列号,参数map2指代的是像素点所在位置的行号。
例如,我们想将目标图像(映射结果图像)中某个点A映射为原始图像内处于第0行第3列上的像素点B,那么需要将A点所对应的参数map1对应位置上的值设为3,参数map2对应位置上的值设为0。所以,通常情况下,我们将map1写为mapx,并且将map2写成mapy,以方便理解。 - 同样,如果想将目标图像(映射结果图像)中所有像素点都映射为原始图像内处于第0行第3列上的像素点B,那么需要将参数map1内的值均设为3,将参数map2内的值均设为0。














网友评论