При обработке изображений эта вещь называется переводом изображения.
Исходное изображение:
import cv2
import numpy as np
# Read image
img = cv2.imread("roi.jpg")
# The number of pixels
num_rows, num_cols = img.shape[:2]
# Creating a translation matrix
translation_matrix = np.float32([ [1,0,70], [0,1,110] ])
# Image translation
img_translation = cv2.warpAffine(img, translation_matrix, (num_cols,num_rows))
#cv2.namedWindow('Translation', cv2.WINDOW_NORMAL)
cv2.imshow('Translation', img_translation)
cv2.waitKey(0)
cv2.destroyAllWindows()
Это даст вам:
Но мы хотим что-то вроде этого:
Перевод в основном означает, что мы смещаем изображение, добавляя / вычитая координаты X и Y. Для этого нам нужно создать матрицу преобразования, как показано ниже:
Здесь значения tx и ty являются значениями перевода X и Y, то есть изображение будет перемещаться на X единиц вправо и на Y единиц вниз.
Так что, как только мы создадим такую матрицу, мы можем использовать функцию warpAffine, чтобы применить ее к нашему изображению.
Третий аргумент в warpAffine относится к числу строк и столбцов в результирующем изображении. Поскольку количество строк и столбцов совпадает с исходным изображением, результирующее изображение будет обрезано. Причина этого в том, что у нас не было достаточно места на выходе, когда мы применили матрицу перевода. Чтобы избежать обрезки, мы можем сделать что-то вроде этого:
img_translation = cv2.warpAffine(img, translation_matrix, (num_cols + 70, num_rows + 110))
cv2.namedWindow('Translation', cv2.WINDOW_NORMAL)
cv2.imshow('Translation', img_translation)
cv2.waitKey(0)
cv2.destroyAllWindows()
И это приведет к:
Помните, что это изображение изменяется при загрузке здесь, не волнуйтесь, это ваш желаемый результат.
Более того, если мы хотим переместить изображение в середине большей рамки изображения; мы можем сделать что-то подобное, выполнив следующее:
num_rows, num_cols = img.shape[:2]
translation_matrix = np.float32([ [1,0,70], [0,1,110] ])
img_translation = cv2.warpAffine(img, translation_matrix, (num_cols + 70, num_rows + 110))
translation_matrix = np.float32([ [1,0,-30], [0,1,-50] ])
img_translation = cv2.warpAffine(img_translation, translation_matrix, (num_cols + 70 + 30, num_rows + 110 + 50))
cv2.namedWindow('Translation', cv2.WINDOW_NORMAL)
cv2.imshow('Translation', img_translation)
cv2.waitKey(0)
cv2.destroyAllWindows()
Что дает вам вывод: