Мне нужно найти способ искажать изображения с помощью векторов сдвига.Я нашел нечто, скажем, похожее, но это не может быть применено к моей проблеме.
Вот пример изображения, которое я хочу деформировать:
Теперь я нашел способ сделать это в PIL, вот пример кода:
from PIL import Image
image = Image.open('Untitled.tif')
grid = [
[
# 1
[0, 0, 300, 300],
[0, 0, 0, 300, 400, 400, 300, 0]
],
[
# 2
[300, 0, 600, 300],
[300, 0, 400, 400, 500, 400, 600, 0]
],
[
# 3
[600, 0, 900, 300],
[600, 0, 500, 400, 900, 300, 900, 0]
],
[
# 4
[0, 300, 300, 600],
[0, 300, 0, 600, 400, 500, 400, 400]
],
[
# 5
[300, 300, 600, 600],
[400, 400, 400, 500, 500, 500, 500, 400]
],
[
# 6
[600, 300, 900, 600],
[500, 400, 500, 500, 900, 600, 900, 300]
],
[
# 7
[0, 600, 300, 900],
[0, 600, 0, 900, 300, 900, 400, 500]
],
[
# 8
[300, 600, 600, 900],
[400, 500, 300, 900, 600, 900, 500, 500]
],
[
# 9
[600, 600, 900, 900],
[500, 500, 600, 900, 900, 900, 900, 600]
]
]
result = image.transform(image.siresultingage.MESH, grid)
Это изображение результата:
Проблема состоит в том, что в этом методе мне нужно указать прямоугольные области и другую четырехугольную область, чтобы соответствовать первой.Мои векторы сдвига - это просто координаты ([x1, y1, x2, y2]
, где x1
и y1
- исходные координаты, а x2
и y2
- координаты цели), поэтому мне нужен метод для выполнения такой деформации с другой сеткойНапример:
grid = [
# x1 y1 x2 y2
[300, 300, 200, 200],
[600, 300, 700, 200],
[300, 600, 200, 700],
[600, 600, 700, 700]
]
Результат (если бы я не ошибся) был бы точно таким же, но входные данные были бы такими же, как у меня.Важно то, что мне нужно использовать TPS в качестве метода интерполяции.Я пытался найти решение в opencv, PIL, scikit image и GDAL, но пока безуспешно.Кто-нибудь знает такие методы?
Возможно, я не описал проблему полностью, поэтому, пожалуйста, спросите, если что-то неясно.