Как по горизонтали поменять местами две половины изображения в python opencv - PullRequest
7 голосов
/ 10 июля 2019

Я не смог найти никаких существующих ответов о том, как это сделать, поэтому я уже написал свой собственный код, который ниже. Возможно, это не самый быстрый способ сделать это, но он работает хорошо.

Ответы [ 2 ]

4 голосов
/ 10 июля 2019

numpy.roll() может использоваться для кругового смещения массива по любой оси.Например, для одномерного массива его можно использовать как:

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).

4 голосов
/ 10 июля 2019

Обмен: (требуется импорт: numpy as 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]))

image - это исходное изображение, которое вы хотите заменить. Он должен быть в формате файла OpenCV, который уже означает, что вы должны были использовать cv2.imread () для открытия файла или преобразовать его из другого типа изображения в opencv

Первая половина ширины берется с использованием 1/2 image.shape. Это становится cutW (ширина)

Затем он копирует последнюю половину изображения в новое изображение под названием "swapped_image"

Затем он добавляет первую половину исходного изображения к swapped_image, используя np.hstack

опционально : показать изображения потом

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 и выбрать половину высоты исходного изображения вместо ширины

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...