Un día, mi amigo me envió algunas imágenes para probar mi algoritmo. El algoritmo funcionó bien, y tuve todo funcionando. Al analizar los resultados, sin embargo, vi que algunas imágenes habían sido rotadas!
Realmente no pude entender la razón. Nada en mi algoritmo realizó ninguna rotación, y fue un poco raro. Afortunadamente, conseguí una explicación de la razón por la que esto sucedió después de todo, y en este post te mostraré los pasos que puedes realizar para analizar las imágenes que se rotan de forma extraña usando Python.
Empecemos!
¿Alguna vez pensó en lo que sucede cuando toma una imagen con la cámara de su teléfono móvil? En este caso, la cámara escribiría la imagen en un archivo de imagen, mientras que al mismo tiempo incluiría otra información en la imagen llamada metadatos; En resumen, se trata de datos sobre datos. Por ejemplo, nuestra imagen se considera datos. Los metadatos podrían ser el momento en que se tomó la imagen..
Los metadatos se escriben en el archivo de imagen utilizando el formato de archivo de imagen intercambiable (Exif). Se incluirán muchas etiquetas de metadatos interesantes en su imagen, como la hacer y modelo Del teléfono utilizado para tomar la foto, además de las etiquetas más interesantes! Por lo tanto, los metadatos pueden incluir información valiosa sobre su imagen..
Si desea profundizar en los datos de Exif, la Asociación de Productos de Cámara e Imagen (CIPA) y la Asociación de Industrias de Tecnología de la Información (JEITA) han formulado conjuntamente el estándar: CIPA DC-008-Traducción Formato de archivo de imagen intercambiable para cámaras digitales: 2.3.
Ahora que sabemos lo que queremos decir con metadatos, sigamos adelante y lea algunas etiquetas de metadatos en nuestra imagen. Para el propósito de este tutorial, estoy usando la imagen a continuación, que se ha tomado con la cámara de un teléfono móvil. La imagen original se puede descargar desde toy.jpg.
Como se mencionó anteriormente, se incluirán diferentes etiquetas de metadatos en la imagen. Escribamos un script de Python que extraiga la información de algunas etiquetas de metadatos de la imagen de arriba. En cuanto a la información, digamos que queremos saber más sobre el hacer y modelo del teléfono móvil con el que se tomó la foto, y del teléfono móvil destello Estado en el momento de tomar la foto. Para eso, vamos a utilizar el módulo ExifTags, que forma parte de la biblioteca de imágenes de Python (PIL).
Primero listaré el script de Python y luego iré paso a paso a través del código:
desde PIL import Image desde PIL.ExifTags import TAGS image = Image.open ('toy.jpg') info = image._getexif () para tag, valor en info.items (): key = TAGS.get (tag) if key == 'Make': print (key + ':' + str (value)) elif key == 'Model': print (key + ':' + str (value)) elif key == 'Flash': print ( tecla + ':' + str (valor))
Lo primero que hicimos fue importar el Imagen
y ETIQUETAS
clases los Imagen
clase se utiliza para representar una imagen PIL, mientras que la clase ETIQUETAS
clase, como se menciona en la documentación, asigna enumeración de etiquetas EXIF enteras de 16 bits a nombres de cadenas descriptivas.
Luego seguimos leyendo nuestra imagen., juguete.jpg
, y usando el ._getexif ()
función que devuelve un diccionario de etiquetas y ellos valores. Después de eso, antes de imprimir el valor de la etiqueta (clave), verificamos si esa clave existe en la imagen como una etiqueta o no..
Si desea tener una lista de las etiquetas disponibles en la imagen, simplemente puede agregar la declaración tecla de impresión
debajo de la variable clave en el bucle for. ¿Qué otras etiquetas podrías ver después de ejecutar esta declaración??
Verificando la salida del script anterior, esto es lo que obtendría si usara juguete.jpg
:
Flash: 0 Marca: Samsung Modelo: SAMSUNG-SM-N920A
Por la salida, sabemos que el teléfono móvil utilizado para tomar la foto que vimos era de tipo samsung
y modelo SAMSUNG-SM-N920A
. ¿Qué pasa con el valor? 0
para la etiqueta Destello
? Si nos referimos al documento estándar vinculado en la sección de Datos Exif arriba, veremos que el valor 0
significa que el flash no disparó a la hora de tomar la foto.
Vayamos a nuestro tema principal: la razón por la que a veces puede encontrar la imagen que transfirió desde la cámara de un teléfono móvil que se está rotando, o con la orientación incorrecta. Podemos descubrir el motivo de este problema analizando los datos Exif de la imagen..
Una etiqueta de metadatos que podemos usar para este propósito es Orientación
, el cual, basado en el documento estándar vinculado anteriormente, muestra la Orientación de la imagen vista en términos de filas y columnas.. Para verificar el valor de la etiqueta de orientación de nuestra imagen, podemos agregar las siguientes declaraciones al final del script anterior:
tecla elif == 'Orientación': imprimir (tecla + ':' + str (valor))
Las declaraciones anteriores volverían Orientación: 1
. Refiriéndonos de nuevo al documento de estándares Exif, el valor 1
medio:
La fila 0 está en la parte superior visual de la imagen, y la 0ª columna está en el lado visual izquierdo.
Para hacer esto más claro, como se describe en la etiqueta de orientación Exif, la descripción anterior se puede leer de la siguiente manera: La fila 0 en la imagen almacenada es la parte superior de la escena capturada, y la columna 0 en la imagen almacenada es el lado izquierdo de la escena capturada. En otras palabras, la imagen no se ha girado en esencia, por lo que no tendríamos problemas de orientación al transferir la imagen desde nuestro teléfono móvil al escritorio. El documento de Rotación de JPEG y Orientación EXIF brinda una buena explicación de la etiqueta de orientación Exif y sus diferentes valores..
Por lo tanto, cuando observa que una imagen que se ha transferido desde su teléfono móvil tiene una rotación inesperada o tiene una orientación incorrecta, solo tiene que volver a la etiqueta de orientación Exif y verificar su valor para una imagen en particular, según la cual podría corrija la orientación de su imagen transferida, o cualquier otra imagen que haya recibido de otra persona.
Esto es particularmente beneficioso cuando está aplicando un algoritmo en un lote de imágenes recuperadas de la cámara de un teléfono móvil, y le gustaría asegurarse de que cada imagen se haya guardado con la orientación correcta.