Я наткнулся на этот вопрос и пытаюсь выполнить преобразование перспективы с помощью Python Pillow.
Это именно то, что я пытаюсь сделать, и как выглядит результат:
И вот код, который я использовал, чтобы попробовать это:
from PIL import Image
import numpy
# function copy-pasted from https://stackoverflow.com/a/14178717/744230
def find_coeffs(pa, pb):
matrix = []
for p1, p2 in zip(pa, pb):
matrix.append([p1[0], p1[1], 1, 0, 0, 0, -p2[0]*p1[0], -p2[0]*p1[1]])
matrix.append([0, 0, 0, p1[0], p1[1], 1, -p2[1]*p1[0], -p2[1]*p1[1]])
A = numpy.matrix(matrix, dtype=numpy.float)
B = numpy.array(pb).reshape(8)
res = numpy.dot(numpy.linalg.inv(A.T * A) * A.T, B)
return numpy.array(res).reshape(8)
# test.png is a 256x256 white square
img = Image.open("./images/test.png")
coeffs = find_coeffs(
[(0, 0), (256, 0), (256, 256), (0, 256)],
[(15, 115), (140, 20), (140, 340), (15, 250)])
img.transform((300, 400), Image.PERSPECTIVE, coeffs,
Image.BICUBIC).show()
Я не совсем уверен, как работает преобразование, нокажется, что точки движутся совершенно в противоположном направлении (например, мне нужно сделать (-15, 115), чтобы точка А переместилась вправо. Однако она также не будет двигаться на 15 пикселей, а на 5).
Как определить точные координаты целевых точек для правильного перекоса изображения?