Если вы хотите нелинейно преобразовать изображение и сохранить те же размеры, вы можете использовать numpy индексирование массива.
Метод 1: использование numpy индексации массива без какой-либо интерполяции. Вызывает видимое квантование в преобразованном изображении, когда исходное пространство растягивается.
Метод 2: с использованием перераспределения opencv, использует линейную интерполяцию. Интерполяция скрывает сильное растяжение исходного домена.
import cv2
import numpy as np
# load in image
image = cv2.imread('face.jpg')
transform = np.zeros(image.shape, dtype=image.dtype)
# non-linear transform
original_space = np.linspace(0, 1, image.shape[0])
new_space = original_space**2
# map the new space over the dimensions of the image
mapping = (new_space*(image.shape[0]-1)).astype(np.float32)
# method1 (no interpolation)
# transform[:, :] = image[mapping.astype(np.int), :]
# method2 (linear interpolation, a little better)
x, y = np.indices(image.shape[:2], dtype=np.float32)
x = np.repeat(mapping[np.newaxis].T, image.shape[1], axis=1)
transform = cv2.remap(image, y, x, cv2.INTER_LINEAR)
cv2.imshow('image', image)
cv2.imshow('transform', transform)
cv2.waitKey(0)
исходное изображение: https://i.stack.imgur.com/LTThI.jpg
преобразованное изображение: https://i.stack.imgur.com/nlBfj.jpg
преобразовать изображение с помощью переназначения: https://i.stack.imgur.com/dmbIK.jpg