如何在python opencv中水平交换图像的两半

时间:2019-07-10 10:11:43

标签: python opencv

我找不到有关如何执行此操作的任何现有答案,因此我已经编写了自己的代码,如下所示。这可能不是最快的方法,但效果很好。

2 个答案:

答案 0 :(得分:4)

交换 :(必填导入:numpy为np,cv2)

height, width = image.shape[0:2]
cutW = int(width / 2)
swapped_image = image[0:height, width - cutW:width].copy()
swapped_image = np.hstack((swapped_image, image[0:height, 0:width-cutW]))

图像是您要交换的原始图像。它应该已经是OpenCV文件格式,这意味着您应该已经使用cv2.imread()打开文件,或者将其从其他图像类型转换为opencv

使用1/2 image.shape拍摄前半个宽度。变成cutW(宽度)

然后将图像的最后部分复制到名为“ swapped_image”的新图像中

然后使用np.hstack

将原始图像的一半附加到swapped_image上

可选:随后显示图像

height, width = image.shape[0:2]
cutW = int(width / 2)
swapped_image = image[0:height, width - cutW:width].copy()
swapped_image = np.hstack((swapped_image, image[0:height, 0:width-cutW]))
cv2.imshow("SwappedImage", swapped_image)
cv2.imshow("Original ", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

如果要垂直交换,可以对np.vstack进行相同的操作,然后选择原始图像高度的一半而不是宽度

答案 1 :(得分:2)

https://stackoverflow.com/a/41298329/11420760可用于在任何轴上循环移动数组。例如,对于一维数组,它可以用作:

import numpy as np

arr = np.array(range(10)) 
#  arr = [0 1 2 3 4 5 6 7 8 9]
arr_2 = np.roll(arr, len(arr)//2)
#  arr_2 = [5 6 7 8 9 0 1 2 3 4]

相同的方法可用于水平交换两半图像:

import cv2
import numpy as np

img = cv2.imread('Figure.png', 0)
img = np.roll(img, img.shape[1]//2, axis = 1)

np.roll(img, img.shape[0]//2, axis = 0)用于垂直交换。