我找不到有关如何执行此操作的任何现有答案,因此我已经编写了自己的代码,如下所示。这可能不是最快的方法,但效果很好。
答案 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)
用于垂直交换。