es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo aplicar una transformación afín a un solo punto en PIL?

En PIL he rotado un rectángulo en un ángulo y lo he pegado de nuevo en la imagen de fondo.
Me gustaría saber cuáles serán las nuevas coordenadas de una esquina específica.

función (coordenadas_antiguas) => coordenadas nuevas

He leído en la documentación que menciona que el centro de rotación por defecto es el centro de la imagen.

Aquí está mi código:

import PIL
from PIL import Image, ImageDraw
import os

background = Image.open('background.jpg')
rectangle = Image.open("rectangle.png")
my_angle = 30

rectangle_rotate = Image.Image.rotate(rectangle, angle=my_angle, resample=Image.BICUBIC, expand=True)

# box: 2-tuple que da la esquina superior izquierda
px = int(background.size[0] / 2)
py = int(background.size[1] / 2)
background.paste(im=rectangle_rotate,
                     box=(px, py),
                     mask=rectangle_rotate)
# ¡La nueva posición que estoy obteniendo es incorrecta, ¿cómo puede ser?????
pos_xNuevo = px * math.cos(math.radians(my_angle)) + py * math.sin(math.radians(my_angle))
pos_yNuevo = -px * math.sin(math.radians(my_angle)) + py * math.cos(math.radians(my_angle))
print('pos_xNuevo:', pos_xNuevo)
print('pos_yNuevo:', pos_yNuevo)
draw_img_pts = ImageDraw.Draw(background)
r = 10
# Dibujando un círculo pequeño simple para visualización
draw_img_pts.ellipse((pos_xNuevo - r, pos_yNuevo - r, pos_xNuevo + r, pos_yNuevo + r), fill='red')

background.save('ejemplo_con_rotacion.png')

¿Cómo puedo encontrar el valor de las nuevas coordenadas? Sigo obteniendo un valor incorrecto.

Imagen de fondo (entrada):
background

Imagen del rectángulo (entrada):
rectangle

La salida que obtuve sin rotación de cero, como se esperaba:
zero rotation

Salida que obtuve después de una rotación de 30 grados:
30 degree rotation

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para encontrar las nuevas coordenadas de una esquina específica después de rotar un rectángulo en un ángulo y pegarlo de nuevo en la imagen de fondo en PIL, puedes utilizar la función affine_transform del módulo PIL.Image.

    Suponiendo que deseas encontrar las nuevas coordenadas de la esquina superior izquierda del rectángulo, primero puedes calcular las coordenadas de las cuatro esquinas del rectángulo original con respecto a su esquina superior izquierda, utilizando el método getbbox del objeto de imagen del rectángulo:

    x1, y1, x2, y2 = rectangle.getbbox()
    relative_corners = [(x1, y1), (x2, y1), (x2, y2), (x1, y2)]
    

    Luego, puedes aplicar la misma rotación a estas coordenadas relativas de las esquinas utilizando la función affine_transform:

    import math
    from PIL.Image import affine_transform
    
    angle_rad = math.radians(my_angle)
    matrix = [math.cos(angle_rad), math.sin(angle_rad), -math.sin(angle_rad), math.cos(angle_rad), 0, 0]
    new_corners = [affine_transform(c, matrix) for c in relative_corners]
    

    Finalmente, puedes agregar las coordenadas de la esquina superior izquierda del rectángulo rotado a estas coordenadas relativas para obtener su posición absoluta en la imagen de fondo:

    new_x1, new_y1 = px + new_corners[0][0], py + new_corners[0][1]
    

    Las variables new_x1 y new_y1 contendrán las nuevas coordenadas de la esquina superior izquierda del rectángulo rotado en la imagen de fondo.

Comments are closed.