Closed BlancaCC closed 2 years ago
He estado reflexionando sobre esto, quizás sea mejor implementar una función aparte que dada la matriz, realiza la transformación euclídea de la imagen a copiar a las coordenadas de la imagen target (son operaciones diferentes y así no la lío modificando la función sourceBoundary).
@Exequielac Sí, lo ideal sería tener otra función y componerlas
He empezado la implementación y me he quedado un poco estancado. A continuación resumo las ideas que he tenido:
@Exequielac Por este commit entiendo que has empezado la implementación. Cuando lo más sencillo sería comenzar con la parte matemática, que contempla todos los casos y no da lugar equívocos. Una vez se tenga eso, la traducción del código sería directa.
https://www.ugr.es/~fjlopez/_private/Geometria_III.pdf
Aquí diría que está toda la teoría que te hace falta. De todas formas a lo largo de la mañana puedo formalizarlo yo si quieres
@BlancaCC Intentaría enfocarlo de la siguiente manera:
(Simetrías, translaciones y rotaciones y sus composiciones)
Estos tienen asociadas una matriz, te dejo que la busques tú 😜
Otros tipo de transformaciones alteraría las distancias y entonces trataríamos con otro problema al que resolver.
Respecto a la implementación:
Para un sistema más avanzado bastaría con fijar tres puntos de en la imagen fuente y manteniendo distancias y ángulo colocar esos tres puntos en la imagen destino. Cómo tres puntos definen una transformación solo habría que calcularla (find homography de opencv creo que lo hacía)
He visto que has definido las siguientes tareas pendientes:
1 TODO: función que reciba una matriz de transformación, la región de inicio y la imagen destino, calcule la nueva región después de la transformación 2 TODO: funciones de interpolación lineal y bilineal 3 TODO: modificación de la función GuidanceFieldGenerator para que tenga en cuenta la transformación inversa.
No termino de entender 1 y 2. Sin embargo 3, creo que se puede cambiar un poco la implementación general, haciendo que la región seleccionada que ahora mismo es un conjunto de 2-uplas de coordenada $(x,y)$ a una 3-upla de $(x,y,g_{x,y})$ es decir: coordenadas y su imagen.
@BlancaCC 1: Cuando se tiene una transformación y un pixel, por ejemplo, (3,2) y se le aplica la transformación y el resultado es, por ejemplo, (12.5, 17.5). ¿Que hacer en este caso? 2: En el caso de la transformación inversa, si se tiene el pixel (12, 10) y al aplicarle la transformación inversa el píxel cae en (3.5, 4.5), ¿Como calcular el valor de la función en ese punto? Había pensado en usar interpolación.
@Exequielac Mientras comía he estado pensando en el problema y he llegado a las siguientes conclusiones:
Expongo posibles soluciones ordenadas de menor coste computacional a más:
Si trabajamos directamente de manera analítica y después usando un redondeo o trucando del valor para asignarlo a los píxeles seguramente se pierdan algunos. Sin embargo la clave puede estar en ¿Cuánto de mala es esa solución? Porque a lo mejor es imperceptible para el ojo humano, todo es probar.
La segunda podría ser aplicar interpolación, pero aumentaría el coste y ¿Habría mucha diferencia con respecto a usar redondeo? (Hay algo de mí que me dice que no renta, pero todo es probarlo).
Tercera opción: está serviría si se quiere tener los pixeles idénticos y la idea es la siguiente:
Pensar en los pixeles seleccionados como un tablero de ajedrez o rejilla. Para un pixel o cuadro concreto existen 8 vecinos. Cuando se aplique el giro estos 8 vecinos deberían de ser los mismos. Luego el algoritmo determinaría las nuevas posiciones de estos.
El problema aquí es:
Respecto al issue de la inversa se podría solucionar no teniéndola que calcular :D
( Se modifica directamente la función de vectores guía para que tome directamente los valores en el dominio transformado)
Para cerrar este issue falta:
Ya solo falta:
Código x : Desccripción de una frase
Cuando todo esto esté hecho hacer (por favor) un full request a main y que el otro revise y mergee :D
Crear una transformación euclídea para pasar de las coordenadas que se tienen en la imagen fuente a la imagen destino de la región a calcular. Hay que tener cuidado porque esta función afecta a otras como:
Probablemente haya que añadir un parámetro que acepte la función inversa de la euclídea definida y vaya cambiando las coordenadas.