Muchos paquetes gráficos tienen funciones para construir una transformación de 4 puntos a 4 puntos del tipo que usted necesita. Por ejemplo, Qt tiene QTransform::quadToSquare y QTransform::quadToQuad, y OpenCV tiene GetPerspectiveTransform.
La transformación no puede ser lineal o afín, tiene que ser una transformación "en perspectiva".
Si quieres codificarlo tú mismo, este artículo te dice cómo. Las fórmulas de ese artículo se muestran más claramente a continuación:
Si queremos transformar los cuatro puntos $(x_i, y_i)$ a los cuatro puntos $(u_i, v_i)$ para $i=0,1,2,3$ podemos utilizar una transformación de perspectiva de la forma $$ u_i = \frac{a_0 x_i + a_1 y_i + a_2}{c_0 x_i + c_1 y_i + 1 } \quad ; \quad v_i = \frac{b_0 x_i + b_1 y_i + b_2}{c_0 x_i + c_1 y_i + 1 } $$ Los ocho coeficientes desconocidos $a_0, a_1, a_2, b_0, b_1, b_2, c_0, c_1$ se puede calcular resolviendo el siguiente sistema lineal:
$$ \begin{bmatrix} x_0 & y_0 & 1 & 0 & 0 & 0 & -x_0u_0 & -y_0u_0 \\ x_1 & y_1 & 1 & 0 & 0 & 0 & -x_1u_1 & -y_1u_1 \\ x_2 & y_2 & 1 & 0 & 0 & 0 & -x_2u_2 & -y_2u_2 \\ x_3 & y_3 & 1 & 0 & 0 & 0 & -x_3u_3 & -y_3u_3 \\ 0 & 0 & 0 & x_0 & y_0 & 1 & -x_0v_0 & -y_0v_0 \\ 0 & 0 & 0 & x_1 & y_1 & 1 & -x_1v_1 & -y_1v_1 \\ 0 & 0 & 0 & x_2 & y_2 & 1 & -x_2v_2 & -y_2v_2 \\ 0 & 0 & 0 & x_3 & y_3 & 1 & -x_3v_3 & -y_3v_3 \end{bmatrix} \begin{bmatrix} a_0 \\ a_1 \\ a_2 \\ b_0 \\ b_1 \\ b_2 \\ c_0 \\ c_1 \end{bmatrix} = \begin{bmatrix} u_0 \\ u_1 \\ u_2 \\ u_3 \\ v_0 \\ v_1 \\ v_2 \\ v_3 \end{bmatrix} $$
Hay muchos paquetes de software disponibles para resolver sistemas lineales de ecuaciones. Una opción es el libro/paquete "Numerical Recipes", que tiene funciones llamadas ludcmp y lubksb. La primera de ellas calcula la descomposición LU de una matriz, y la segunda utiliza esta descomposición LU para resolver un sistema lineal. Hay una larga discusión sobre cómo usar ludcmp y lubksb aquí .
En su ejemplo particular, tenemos $$ (x_0, y_0) = (3,5) \\ (x_1, y_1) = (5,5) \\ (x_2, y_2) = (2,2) \\ (x_3, y_3) = (6,1) \\ (u_0, v_0) = (0,3) \\ (u_1, v_1) = (3,3) \\ (u_2, v_2) = (0,0) \\ (u_3, v_3) = (3,0) \\ $$ El sistema de ecuaciones es $$ 3 a_0 + 5 a_1 + a_2 = 0 \\ 5 a_0 + 5 a_1 + a_2 - 15 c_0 - 15 c_1 = 3 \\ 2 a_0 + 2 a_1 + a_2 = 0 \\ 6 a_0 + a_1 + a_2 - 18 c_0 - 3 c_1 = 3 \\ 3 b_0 + 5 b_1 + b_2 - 9 c_0 - 15 c_1 = 3 \\ 5 b_0 + 5 b_1 + b_2 - 15 c_0 - 15 c_1 = 3 \\ 2 b_0 + 2 b_1 + b_2 = 0 \\ 6 b_0 + b_1 + b_2 = 0 $$ He resuelto este sistema de ecuaciones utilizando Mathematica, y he obtenido $$ a_0 = \frac{36}{49} \quad ; \quad a_1 = -\frac{12}{49} \quad ; \quad a_2 = -\frac{48}{49} \\ b_0 = \frac{24}{245} \quad ; \quad b_1 = \frac{96}{245} \quad ; \quad b_2 = -\frac{48}{49} \\ c_0 = \frac{8}{245} \quad ; \quad c_1 = -\frac{33}{245} $$ Por lo tanto, la transformación requerida (después de algunas simplificaciones) es $$ u = \frac{60 (3 x-y-4)}{8 x-33 y+245} \\ v = \frac{24 (x+4 y-10)}{8 x-33 y+245} $$ Puedes confirmar fácilmente que esta transformación mapea correctamente los cuatro puntos dados.