Как изменить ось Y 2D-изображения? - PullRequest
0 голосов
/ 18 июня 2020

Я хотел бы изменить размер изображения по оси Y (2D np.array на python), как в этом примере.

enter image description here

Я не хочу изменять ось x. Есть ли простой способ сделать это на python, например, с openCV?

1 Ответ

1 голос
/ 18 июня 2020

Если вы хотите нелинейно преобразовать изображение и сохранить те же размеры, вы можете использовать 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

...