如何使用OpenCV在Python中执行图像平移?
将图像位置朝特定方向移动称为图像平移。要执行图像平移,我们首先应该了解什么是平移矩阵以及如何利用OpenCV和NumPy定义它。
如果我们想要在 (x,y) 方向偏移,偏移量分别为 (tx,ty)。其中,tx 是水平方向的偏移量,ty 是垂直方向的偏移量。使用 (tx,ty),我们可以将平移矩阵 M 定义为下面的形式 −
M = np.float32([[1,0,tx],[0,1,ty]])
平移矩阵 M 是类型为 np.float32 的 numpy 数组。我们将 M 传递给 cv2.warpAffine() 函数作为一个参数。请看以下语法 −
语法
cv2.warpAffine(img,M,(w,h))
在这里,
- img − 要移动的图像。
-
M − 上述定义的平移矩阵。
-
(w, h) − 平移后图像的宽度和高度。
注意 − tx 的正值会使图像向右移,而负值会使图像向左移。同样地, ty 的 正值将使图像向下移动,而 负值将使图像向上移动。
步骤
要执行图像平移,可以按照下面的步骤进行−
导入所需的库。在下面的所有 Python 示例中,需要的 Python 库为 OpenCV 和 NumPy。确保已经安装它。
import cv2
import numpy as np
使用 cv2.imread() 函数读取输入图像。传递输入图像的完整路径。
img = cv2.imread('interior.jpg')
定义平移矩阵 M。这里我们取 (tx,ty) = (100,50),即向右移动100个像素,向下移动50个像素。
M = np.float32([[1,0,100],[0,1,50]])
使用上述定义的平移矩阵对输入图像进行平移。
img = cv2.warpAffine(img,M,(w,h))
显示已平移的图像。
cv2.imshow('Image Translation', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
示例 1
在此示例中,我们将以水平向右100个像素和垂直向下50个像素平移输入图像。
# 导入所需的库
import cv2
import numpy as np
# 读取输入图像
img = cv2.imread('interior.jpg')
# 访问图像的高度和宽度
height, width, _ = img.shape
# 定义平移矩阵
M = np.float32([[1,0,100],[0,1,50]])
# 执行平移
img = cv2.warpAffine(img,M,(width,height))
# 显示平移后的图像
cv2.imshow('Image Translation', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出
当运行以上程序时,将生成以下输出窗口。
示例2
在此程序中,我们执行四个不同的平移。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('interior.jpg')
rows,cols,_ = img.shape
M_left = np.float32([[1,0,-50],[0,1,0]])
M_right = np.float32([[1,0,50],[0,1,0]])
M_top = np.float32([[1,0,0],[0,1,50]])
M_bottom = np.float32([[1,0,0],[0,1,-50]])
img_left = cv2.warpAffine(img,M_left,(cols,rows))
img_right = cv2.warpAffine(img,M_right,(cols,rows))
img_top = cv2.warpAffine(img,M_top,(cols,rows))
img_bottom = cv2.warpAffine(img,M_bottom,(cols,rows))
plt.subplot(221), plt.imshow(img_left), plt.title('左')
plt.subplot(222), plt.imshow(img_right), plt.title('右')
plt.subplot(223), plt.imshow(img_top), plt.title('上')
plt.subplot(224), plt.imshow(img_bottom), plt.title('下')
plt.show()
输出
当你运行上面的程序时,它将产生如下输出窗口。
请注意,第一张图显示图像向左移动了50像素,第二张图显示图像向右移动了50像素,第三张图显示图像向上移动了50像素,最后一张图显示图像向下移动了50像素。