En dag sendte min venn meg noen bilder for å teste min algoritme på. Algoritmen fungerte bra, og jeg fikk alt som løp gjennom. Ved analysering av resultatene så jeg imidlertid at noen bilder hadde blitt rotert!
Jeg kunne virkelig ikke forstå grunnen. Ingenting i min algoritme gjorde noen rotasjoner, og det var litt rart. Heldigvis fikk jeg tak i grunnen til at dette skjedde etter alt, og i dette innlegget vil jeg gå deg gjennom trinnene du kan utføre for å analysere bilder som roteres underlig med Python.
La oss komme i gang!
Har du noen gang tenkt på hva som skjer når du tar et bilde ved hjelp av mobiltelefonkameraet ditt? I dette tilfellet ville kameraet skrive bildet til en bildefil, samtidig som det inkluderte annen informasjon i bildet som ble kalt metadata; Kort sagt, dette er data om data. For eksempel er bildet vårt betraktet som data. Metadata kan være tiden da bildet ble tatt.
Metadata er skrevet til bildefilen ved hjelp av Exchange-formatet (Exif). Mange interessante metadatakoder vil bli inkludert i bildet ditt, for eksempel gjøre og modell av telefonen pleide å ta bildet, i tillegg til flere interessante tagger! Metadata kan således inneholde verdifull informasjon om bildet ditt.
Hvis du vil grave dypere inn i Exif-data, har CIPA og Information Technology Industries Association (JEITA) i fellesskap formulert standarden: CIPA DC-008-Translation Utskiftbart bildefilformat for digitale stillbilder: Exif Version 2.3.
Nå som vi vet hva vi mener med metadata, la oss gå videre og lese noen metadatakoder i bildet vårt. I denne veiledningen bruker jeg bildet nedenfor, som er tatt med et mobilkamera. Det opprinnelige bildet kan lastes ned fra toy.jpg.
Som nevnt ovenfor, vil forskjellige metadatakoder bli inkludert i bildet. La oss skrive et Python-skript som ville trekke ut informasjonen til noen metadatakoder fra bildet ovenfor. Når det gjelder informasjonen, la oss si at vi vil vite mer om gjøre og modell av mobiltelefonen som bildet ble tatt med, og blits status når du tok bildet. For det skal vi bruke ExifTags-modulen, som er en del av Python Imaging Library (PIL).
Jeg vil liste Python-skriptet først, og deretter gå gjennom koden trinn for trinn:
fra PIL import Bilde fra PIL.ExifTags import TAGS image = Image.open ('toy.jpg') info = image._getexif () for tag, verdi i info.items (): key = TAGS.get (tag) hvis nøkkel == 'Lag': skriv ut (tast + ':' + str (verdi)) elif nøkkel == 'Modell': skriv ut (tast + ':' + str (verdi)) elif nøkkel == 'Flash': print nøkkel + ':' + str (verdi))
Det første vi gjorde er å importere Bilde
og TAGS
klasser. De Bilde
Klassen brukes til å representere et PIL-bilde, mens TAGS
klassen, som nevnt i dokumentasjonen, kartlegger 16-biters heltall-EXIF-merker til beskrivende strengenavn.
Vi går videre ved å lese bildet vårt, toy.jpg
, og bruke ._getexif ()
funksjon som returnerer en ordbok av tags og deres verdier. Etter det, før du skriver ut verdien av taggen (nøkkel), kontrollerer vi om nøkkelen finnes i bildet som en tag i det hele tatt eller ikke.
Hvis du vil ha en liste over tilgjengelige tagger i bildet, kan du bare legge til setningen utskriftstast
under nøkkelvariabelen i forløpet. Hvilke andre tagger kan du se etter å ha kjørt denne setningen?
Kontrollerer utgangen av det ovennevnte skriptet, dette er hva du ville få hvis du brukte toy.jpg
:
Flash: 0 Merke: samsung Modell: SAMSUNG-SM-N920A
Fra produksjonen vet vi at mobiltelefonen som brukes til å ta bildet vi så, var av typen samsung
og modell SAMSUNG-SM-N920A
. Hva med verdien 0
for taggen Blits
? Hvis vi refererer til standard dokumentet som er koblet i Exif Data-delen ovenfor, ser vi verdien 0
betyr at flash brann ikke på tidspunktet for å ta bildet.
La oss komme til hovedtemaet vårt: Årsaken til at du kanskje noen ganger finner bildet du overførte fra et mobilkamera som ble rotert, eller med feil orientering. Vi kan finne årsaken til dette problemet ved å analysere Exif-dataene på bildet.
En metadatagang vi kan bruke til dette formålet er orientering
, som, basert på standard dokumentet koblet over, viser bildeorientering sett i form av rader og kolonner. For å sjekke orienteringsmerkeverdien for bildet vårt, kan vi legge til følgende setninger på slutten av det ovennevnte skriptet:
elif nøkkel == 'Orientering': utskrift (tast + ':' + str (verdi))
Ovennevnte uttalelser ville returnere Orientering: 1
. Henvisning til Exif-standarddokumentet, verdien 1
midler:
Den første raden er på bildet øverst på bildet, og den første kolonnen er den visuelle venstre side.
For å gjøre dette klarere, som beskrevet i Exif Orientation Tag, kan beskrivelsen ovenfor leses som følger: 0. rad i det lagrede bildet er toppen av den oppfangne scenen, og den 0ste kolonnen i det lagrede bildet er venstre side av den oppfangne scenen. Bildet har med andre ord ikke blitt rotert i det hele tatt, så vi ville ikke ha noen orienteringsproblemer når du overfører bildet fra vår mobiltelefon til skrivebordet. JPEG-rotasjons- og EXIF-orienteringsdokumentet gir en fin forklaring på Exif-orienteringsmerket og dens forskjellige verdier.
Når du merker at et bilde som er overført fra mobiltelefonen din har en uventet rotasjon eller har feil orientering, må du bare gå tilbake til Exif Orientation-taggen og kontrollere verdien for et bestemt bilde, basert på hvilket du kunne korriger orienteringen på det overførte bildet, eller et annet bilde du mottok fra noen andre.
Dette er spesielt gunstig når du bruker en algoritme på en serie bilder hentet fra et mobiltelefonkamera, og du vil sørge for at hvert bilde er lagret med riktig orientering.