2016-05-30 3 views
2

Python PIL библиотека позволяет мне карту любой четырехугольник на изображении, чтобы прямоугольник с помощьюКак сопоставить изображение прямоугольника на четырехугольник с PIL?

im.transform(size, QUAD, data) 

Что мне нужно, это функция, которая делает противоположное, то есть карта прямоугольное изображение для указанного четырехугольника.

Я полагал, что это может быть достигнуто с помощью вышеупомянутой функции, как это:

enter image description here

Т.е. Я бы нашел такой квад (красный в изображении), который бы с помощью функции im.transform (size, QUAD, data) преобразовал изображение в квадрат, который я хочу. Проблема в том, что я не знаю, как найти красный квадрат.

Я был бы признателен за любую идею о том, как найти красный квадратик или любой другой способ сопоставить прямоугольное изображение с квадратом, только с PIL, если это возможно.

+0

До сих пор я нашел эту статью: http://www.fmwconcepts.com/imagemagick/bilinearwarp/FourCornerImageWarp2.pdf. –

+0

Я никогда не делал этого сам. Однако, читая документацию, кажется, что «im.transform (размер, PERSPECTIVE, data) image» делает то, что вы пытаетесь достичь. – physicalattraction

ответ

2

Поэтому я решил проблему с простым форвардным сопоставлением, а не с обратным отображением, которое обычно лучше, но в моем приложении я только когда-либо отображаю прямоугольник в квадрат, который меньше прямоугольника, поэтому обычно нет дырок в преобразованном изображении. Код выглядит следующим образом:

def reverse_quad_transform(image, quad_to_map_to, alpha): 
    # forward mapping, for simplicity 

    result = Image.new("RGBA",image.size) 
    result_pixels = result.load() 

    width, height = result.size 

    for y in range(height): 
    for x in range(width): 
     result_pixels[x,y] = (0,0,0,0) 

    p1 = (quad_to_map_to[0],quad_to_map_to[1]) 
    p2 = (quad_to_map_to[2],quad_to_map_to[3]) 
    p3 = (quad_to_map_to[4],quad_to_map_to[5]) 
    p4 = (quad_to_map_to[6],quad_to_map_to[7]) 

    p1_p2_vec = (p2[0] - p1[0],p2[1] - p1[1]) 
    p4_p3_vec = (p3[0] - p4[0],p3[1] - p4[1]) 

    for y in range(height): 
    for x in range(width): 
     pixel = image.getpixel((x,y)) 

     y_percentage = y/float(height) 
     x_percentage = x/float(width) 

     # interpolate vertically 
     pa = (p1[0] + p1_p2_vec[0] * y_percentage, p1[1] + p1_p2_vec[1] * y_percentage) 
     pb = (p4[0] + p4_p3_vec[0] * y_percentage, p4[1] + p4_p3_vec[1] * y_percentage) 

     pa_to_pb_vec = (pb[0] - pa[0],pb[1] - pa[1]) 

     # interpolate horizontally 
     p = (pa[0] + pa_to_pb_vec[0] * x_percentage, pa[1] + pa_to_pb_vec[1] * x_percentage) 

     try: 
     result_pixels[p[0],p[1]] = (pixel[0],pixel[1],pixel[2],min(int(alpha * 255),pixel[3])) 
     except Exception: 
     pass 

    return result