淮北网站网站建设,做短租哪个网站好,太原网站搜索引擎优化,.mom域名可以做网站吗什么是重映射#xff1f;
重映射#xff08;Remapping#xff09;是图像处理中的一种操作#xff0c;用于将图像中的像素从一个位置映射到另一个位置。重映射可以实现图像的平移、旋转、缩放和透视变换等效果。它是一种基于像素级的图像变换技术#xff0c;可以通过定义映…什么是重映射
重映射Remapping是图像处理中的一种操作用于将图像中的像素从一个位置映射到另一个位置。重映射可以实现图像的平移、旋转、缩放和透视变换等效果。它是一种基于像素级的图像变换技术可以通过定义映射关系来改变图像的几何形状和外观。
在重映射中我们需要定义一个映射表Map这个映射表指定了源图像中每个像素点在目标图像中的位置。对于每个像素点 (x, y)映射表告诉我们在目标图像中的新位置 (x’, y’)。通过对所有像素点进行映射我们就可以得到经过重映射变换后的新图像。
在OpenCV中可以使用 cv2.remap() 函数来执行重映射操作。cv2.remap() 接受输入图像和一个表示映射关系的两个浮点型数组map_x 和 map_y。数组 map_x 和 map_y 的大小必须与输入图像的大小相同并且每个元素 (x, y) 表示源图像中的像素点 (x, y) 在目标图像中的新位置 (x’, y’)。
重映射应用场景
重映射在图像处理和计算机视觉领域有许多应用场景。以下是一些常见的重映射应用场景
图像畸变校正相机镜头引起的畸变如透视畸变、鱼眼畸变等会导致图像中的直线弯曲或形状失真。通过重映射技术可以校正这些畸变使图像看起来更加自然和真实。
图像配准在多幅图像中找到对应点并将它们对齐使得它们在相同视角或坐标系下表现一致。这在图像拼接、全景图像合成和多视角图像处理中非常有用。
图像稳定在视频处理中当相机存在抖动或运动时可以使用重映射技术来稳定视频保持图像内容相对稳定减少抖动效应。
视角变换通过重映射可以改变图像的视角实现缩放、旋转、平移和透视等效果从而得到不同角度或大小的图像。
增强现实 (AR) 应用在AR应用中通过对现实世界图像进行重映射将虚拟物体或信息叠加到真实世界中实现真实与虚拟的交互效果。
图像处理与滤波重映射技术可以应用于图像处理中的滤波、图像增强和特效处理从而实现各种图像变换和处理效果。
视频流处理在实时视频流处理中可以使用重映射技术对图像进行实时变换和校正以满足特定的需求。 这些只是重映射在图像处理和计算机视觉中的一些常见应用场景。实际上重映射技术非常灵活和强大可以在许多不同的领域中发挥重要作用帮助我们处理和改善图像数据。 映射参数的理解
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 代表插值方式 borderMode 代表边界模式。当该值为 BORDER_TRANSPARENT 时表示目标图像内 的对应源图像内奇异点outliers的像素不会被修改。 borderValue 代表边界值该值默认为 0。
重映射通过修改像素点的位置得到一幅新图像。在构建新图像时需要确定新图像中每个像素点在原始图像中的位置。因此映射函数的作用是查找新图像像素在原始图像内的位置。该过程是将新图像像素映射到原始图像的过程因此被称为反向映射。在函数 cv2.remap()中参数 map1 和参数 map2 用来说明反向映射map1 针对的是坐标 xmap2 针对的是坐标 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。
实验
使用 cv2.remap()完成数组映射将目标数组内的所有像素点都映射为原始图像内第 0 行第 3 列上的像素点以此来了解函数 cv2.remap()内参数 map1 和 map2 的使 用情况。 根据题目要求可以确定
用来指定列的参数 map1mapx内的值均为 3。 用来指定行的参数 map2mapy内的值均为 0。
import cv2
import numpy as np
imgnp.random.randint(0,256,size[4,5],dtypenp.uint8)
rows,colsimg.shape
mapx np.ones(img.shape,np.float32)*3
mapy np.ones(img.shape,np.float32)*0
rstcv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)
print(img\n,img)
print(mapx\n,mapx)
print(mapy\n,mapy)
print(rst\n,rst)运行结果
img[[253 90 32 65 181][187 184 148 12 212][157 229 255 138 115][156 38 62 89 241]]
mapx[[3. 3. 3. 3. 3.][3. 3. 3. 3. 3.][3. 3. 3. 3. 3.][3. 3. 3. 3. 3.]]
mapy[[0. 0. 0. 0. 0.][0. 0. 0. 0. 0.][0. 0. 0. 0. 0.][0. 0. 0. 0. 0.]]
rst[[65 65 65 65 65][65 65 65 65 65][65 65 65 65 65][65 65 65 65 65]]通过观察上述结果可知目标图像数组dst 内的所有值都来源于原始图像中第 0 行第 3 列上的像素值 65。
复制
为了更好地了解重映射函数 cv2.remap()的使用方法本节介绍如何通过该函数实现图像的复制。在映射时将参数进行如下处理
将 map1 的值设定为对应位置上的 x 轴坐标值。 将 map2 的值设定为对应位置上的 y 轴坐标值。
通过上述处理后可以让函数 cv2.remap()实现图像复制。下面通过一个例题来观察实现复 制时如何设置函数 cv2.remap()内的 map1 和 map2 参数的值。
使用函数 cv2.remap()完成数组复制了解函数 cv2.remap()内参数 map1和 map2 的使用情况。
这里为了方便理解将参数 map1 定义为 mapx将参数 map2 定义为 mapy。后续程序中都采用了这种定义方式后面不再重复说明。
import cv2
import numpy as np
imgnp.random.randint(0,256,size[4,5],dtypenp.uint8)
rows,colsimg.shape
mapx np.zeros(img.shape,np.float32)
mapy np.zeros(img.shape,np.float32)
for i in range(rows):for j in range(cols):mapx.itemset((i,j),j)mapy.itemset((i,j),i)
rstcv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)
print(img\n,img)
print(mapx\n,mapx)
print(mapy\n,mapy)
print(rst\n,rst)运行程序出现如下结果
img[[151 137 24 88 216][ 8 112 205 130 44][ 78 106 1 134 85][190 55 135 56 64]]
mapx[[0. 1. 2. 3. 4.][0. 1. 2. 3. 4.][0. 1. 2. 3. 4.][0. 1. 2. 3. 4.]]
mapy[[0. 0. 0. 0. 0.][1. 1. 1. 1. 1.][2. 2. 2. 2. 2.][3. 3. 3. 3. 3.]]
rst[[151 137 24 88 216][ 8 112 205 130 44][ 78 106 1 134 85][190 55 135 56 64]]通过本例可以观察到参数 mapx 和参数 mapy 分别设置了 x 轴方向的坐标和 y 轴方向的 坐标。函数 cv2.remap()利用参数 mapx、mapy 所组成的数组构造的映射关系实现了图像的复制。 例如rst 中的像素点[3,4]在 src 内的 x、y 轴坐标如下 x 轴坐标取决于 mapx 中 mapx[3,4]的值为 4。 y 轴坐标取决于 mapy 中 mapy[3,4]的值为 3。 这说明 rst[3,4]来源于原始图像 src 的第 4 列x 轴方向由 mapx[3,4]决定、第 3 行y 轴方向由 mapy[3,4]决定即 rst[3,4]src[3,4]。原始对象 src[3,4]的值为 64所以目标对象 rst[3,4]的值为 64。
像绕 x 轴的翻转
import cv2
import numpy as np
imgcv2.imread(lena.png)
rows,colsimg.shape[:2]
mapx np.zeros(img.shape[:2],np.float32)
mapy np.zeros(img.shape[:2],np.float32)
for i in range(rows):for j in range(cols):mapx.itemset((i,j),j)mapy.itemset((i,j),rows-1-i)
rstcv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)
cv2.imshow(original,img)
cv2.imshow(result,rst)
cv2.waitKey()
cv2.destroyAllWindows()左图是原始图像右图是翻转结果图像
还有绕Y 翻转绕X,Y 轴翻转更多操作多动作试试