OpenCV remap

Ammar Ali 2024年2月15日
OpenCV remap

本教程将讨论使用 Python 中 OpenCV 的 remap() 函数根据地图转换图像。

使用 OpenCV 的 remap() 函数根据 Python 中的地图转换图像

我们可以使用 OpenCV 的 remap() 函数根据地图转换图像。例如,如果我们想垂直翻转图像,我们必须改变其像素的位置或位置。

要垂直翻转图像,我们可以将图像的第一行替换为最后一行,将第二行替换为倒数第二行,等等。在 remap() 函数中,我们提供了我们想要的新地图转换给定的图像。

remap() 函数将根据给定的地图移动每个图像像素并将其保存在变量中。例如,让我们使用 remap() 函数垂直翻转图像。

我们必须创建与源图像大小相同的 x 轴和 y 轴图。为了初始化地图,我们可以使用 NumPyzeros() 函数来创建两个空地图。

之后,我们需要用我们想要移动给定图像的每个像素的位置值填充两个地图。例如,如果我们要翻转图像,第一个像素应该垂直移动到最后一个。

换句话说,我们必须将位于 (0,0) 的像素移动到 (0, last)。这意味着我们只需更改 y 轴或行的值即可垂直翻转图像。

在 x 轴图中,第一列应包含所有零值,最后一列应包含等于给定图像列长度的值。

在 y 轴图中,第一行的所有值都应该等于给定图像的行长,最后一行的值应该等于 0。

请参阅下面的代码。

import cv2
import numpy as np

src_img = cv2.imread("cat.jpg")
print("image shape = ", src_img.shape)
Img_map_x = np.zeros((src_img.shape[0], src_img.shape[1]), dtype=np.float32)
Img_map_y = np.zeros((src_img.shape[0], src_img.shape[1]), dtype=np.float32)

for i in range(Img_map_x.shape[0]):
    Img_map_x[i, :] = [x for x in range(Img_map_x.shape[1])]
for j in range(Img_map_y.shape[1]):
    Img_map_y[:, j] = [Img_map_y.shape[0] - y for y in range(Img_map_y.shape[0])]

print("First map_x value = ", Img_map_x[0, 0])
print("First map_y value = ", Img_map_y[0, 0])

dst_img = cv2.remap(src_img, Img_map_x, Img_map_y, cv2.INTER_LINEAR)

cv2.imshow("Original", src_img)
cv2.imshow("Result", dst_img)
cv2.waitKey(0)

输出:

image shape =  (340, 325, 3)
First map_x value =  0.0
First map_y value =  340.0

重新映射图像

我们可以在输出中看到给定图像的形状以及 x 和 y 轴映射的第一个值。map 的第一个值为 (0, 340) 表示位于 (0, 0) 的图像的第一个像素将移动到 (0, 340) 位置。

remap() 函数的第一个参数是我们要重新映射的图像。该函数的第二个参数是 x 轴映射,第三个参数是 y 轴映射。

函数的第四个参数是用于重新映射值的方法。我们使用了 cv2.INTER_LINEAR 方法,即最近邻插值方法,但我们可以将其更改为任何支持的方法,例如 cv2.INTER_LINEAR 用于双线性插值等。

检查此链接以获取有关插值方法的更多详细信息。我们还可以在 remap() 函数中设置另外两个可选参数。

第一个可选参数是 borderMode,用于设置输出图像的边框。默认情况下,边框模式的值设置为常量边框,但我们可以将其更改为任何支持的边框模式。

检查此链接以获取有关边框类型的更多详细信息。

如果 borderMode 设置为 cv2.BORDER_TRANSPARENT,该函数将不会修改输出图像的异常值。第二个可选参数在恒定边框模式下设置边框值。

默认情况下,它的值为 0,但我们可以将其设置为任何数值。

作者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

相关文章 - OpenCV Image