¿Existen herramientas para nivelar automáticamente una imagen?

Me pregunto si hay alguna herramienta (independiente, complementos de Lightroom/Photoshop u otras) que pueda tomar una foto, buscar líneas que sean casi verticales u horizontales (por ejemplo, horizontes, postes de teléfono, etc.) y rotar y recortar automáticamente el ¿imagen?

Este es un proceso manual para mí en este momento, y parece algo que podría automatizarse.

¿Existe algo así?

Estaba pensando que Image Magick podría lograr esto, pero luego encontré esto: Wizards-toolkit.org/discourse-server/…
Tenga en cuenta que rotar su imagen incluso unos pocos grados es una operación destructiva comparable a ejecutar un filtro de desenfoque sobre su imagen. Eso puede estar bien, pero es mejor practicar para obtener las imágenes correctas en primer lugar. (Y/o use una cámara que pueda rotar automáticamente su sensor ligeramente para que coincida con un nivel).
si usa la interpolación lanczos3, es más como ejecutar un filtro de nitidez sobre él :)
Original, bilineal, bicúbica, lanczos2: sequoiagrove.dk/images/rotateinterp.jpg
Digikam parece tener un complemento para este digikam.org/node/445

Respuestas (5)

Bien puede haber programas que intenten hacer lo que usted describe, pero dudo que sea tan efectivo. Si la cámara está ligeramente inclinada hacia arriba o hacia abajo, podría tener una imagen perfectamente nivelada, a pesar de no tener una sola línea horizontal o vertical.

La razón de esto es que, a menos que su cámara esté completamente plana a lo largo del eje óptico (que corre paralelo a la lente), sus postes de telégrafo, etc. no estarán verticales en una imagen, incluso si la cámara está nivelada: las líneas se convergen en un punto de fuga imaginario en el cielo. Del mismo modo, si la cámara no está frente a una línea horizontal verdadera, no se mostrará horizontal en la imagen.

Es posible emplear un enfoque más sofisticado, ya sea tratando de identificar el horizonte en las imágenes, o incluso mejor agrupando líneas que comparten un punto de fuga común, estimando el ángulo de inclinación y, por lo tanto, el ángulo correcto para rotar la imagen, pero tal proceso sería involucrarse considerablemente más.

¿Cómo podría un programa de procesamiento de imágenes saber qué es "nivel"?
@PatFarrell cosas como horizonte, edificios, publicaciones o letreros, etc. Diría que sería mucho más fácil que el reconocimiento facial o la detección de sonrisas.
Donde yo vivo, rara vez se puede ver el horizonte, demasiados árboles. Supongo que el 99% de mis fotos no tienen un letrero, publicación, etc. en ellas.
Respuesta extraña. Esto debería ser relativamente trivial en el mundo de ML de hoy. El software de escritorio de la cámara GoPro tiene nivelación automática de video. Hace este proceso de publicación sin información adicional. No hay razón por la que no pueda hacer lo mismo con las fotos. Entrenar ML para nivelar el horizonte parece un problema de nivel de estudiante (es decir, nada difícil). No necesita ver el horizonte, solo necesita muestras que estén niveladas y muestras que no lo estén. Googleando encontré varios ejemplos como este

Secundo totalmente lo que dijo Matt Grum... tratar de "nivelar" automáticamente una imagen basada en un algoritmo puramente lógico realmente solo sería efectivo en la situación ideal: donde tiene un horizonte perfectamente plano en una imagen correctamente centrada que minimiza la lente y distorsiones de perspectiva.

Considere el escenario en el que usted, como fotógrafo, tomó una foto nivelada de algo, como un lago, que no tiene una orilla perfectamente "horizontalmente plana"... la orilla se curva y finalmente se encuentra con usted. Un algoritmo de computadora puede tratar de nivelar tal imagen haciendo que la orilla del lago sea lo más plana posible... pero eso es incorrecto. La orilla del lago debe estar inclinada y eventualmente curvarse hacia ti. El ojo humano puede detectar tal cosa, ya que involucra numerosas señales de toda la escena, no solo líneas primarias. Pequeñas cosas, como el aspecto "vertical" de los árboles (que puede ser algo muy efímero que sería difícil de acomodar para un algoritmo informático).

Creo que este es uno de esos buenos argumentos para hacer lo mejor que pueda en la cámara, antes de tomar la foto, para asegurarse de que sus tomas estén niveladas. Más allá de las dificultades técnicas de nivelar con precisión las tomas con un algoritmo automático, las rotaciones que no sean de 90 grados son una de las ediciones más destructivas que puede realizar, ya que requiere volver a muestrear cada píxel de la imagen. Si puede tomar sus fotos en la cámara de manera que estén correctamente niveladas, no tendrá que realizar ninguna rotación que provoque esa degradación en los detalles de la imagen.

Sí, no lo he hecho y hay algo de programación en C o Python, pero lo intentaré pronto.

Mi situación es una cámara montada en un mástil que está en una boya tomando una fotografía que siempre contiene el horizonte. Esta debería ser una aplicación más simple que la tuya.

Primero, busque en OpenCV . Específicamente la transformada de la línea de Hough .

Para mi caso, espero que el horizonte sea mucho más distintivo que cualquier otra línea, puedo ajustarlo para encontrar solo una línea. Luego puedo rotar según el ángulo de la línea.

Para su aplicación, creo que filtraría cualquier línea de más de X grados fuera de la horizontal o la vertical.

Un poco de estadísticas, y es posible que pueda averiguar cuánto rotar.

En cuanto a la calidad de imagen degradada, convertiré archivos RAW a ppm en lugar de jpeg, por lo que no debería haber mucho más allá de algunos recortes.

El módulo de desarrollo de Lightroom ahora tiene esto como una opción integrada. No se necesitan programas externos. Puede nivelarse horizontal o verticalmente o, en modo totalmente automático, también compensará las líneas divergentes, etc. Es razonablemente bueno en imágenes donde las líneas verticales y horizontales esperadas son obvias.

Google Photos https://photos.google.com/ también puede hacer esto hoy en día. Sin embargo, no hay compatibilidad con RAW ni procesamiento por lotes, y solo muestra la opción de nivelación automática cuando lo desea.

opción de nivel auto