En dag skickade min vän mig några bilder för att testa min algoritm på. Algoritmen fungerade bra, och jag fick allt igång. När jag analyserade resultaten såg jag emellertid att vissa bilder hade roterats!
Jag kunde verkligen inte förstå orsaken. Ingenting i min algoritm utförde några rotationer, och det var lite konstigt. Lyckligtvis fick jag tag i orsaken till att det här hände trots allt och i det här inlägget kommer jag att gå igenom stegen du kan utföra för att analysera bilder som roteras otroligt med Python.
Låt oss börja!
Har du någonsin funderat på vad som händer när du tar en bild med din mobiltelefon? I så fall skulle kameran skriva bilden till en bildfil samtidigt som den innehåller annan information i bilden som heter metadata; i korthet är detta data om data. Till exempel betraktas vår bild som data. Metadata kan vara den tid då bilden togs.
Metadata skrivs till bildfilen med det utbytbara bildfilformatet (Exif). Många intressanta metadata taggar kommer att inkluderas i din bild, till exempel göra och modell av telefonen brukade ta bilden, förutom mer intressanta taggar! Metadata kan således innehålla värdefull information om din bild.
Om du vill gräva djupare i Exif-data har Camera and Imaging Products Association (CIPA) och Information Technology Industries Association (JEITA) gemensamt formulerat standarden: CIPA DC-008-Translation Utbytbar bildfilformat för digitala stillbildskameror: Exif Version 2,3.
Nu när vi vet vad vi menar med metadata, låt oss fortsätta och läsa några metadatakoder i vår bild. I den här handledningen använder jag bilden nedan, som har tagits med en mobiltelefonkamera. Den ursprungliga bilden kan laddas ner från toy.jpg.
Som nämnts ovan kommer olika metadata taggar att finnas med i bilden. Låt oss skriva ett Python-skript som skulle extrahera informationen från vissa metadataggar från ovanstående bild. När det gäller informationen, låt oss säga att vi vill veta mer om göra och modell av den mobiltelefon som bilden togs med och blixt status när du tar bilden. Därför ska vi använda ExifTags-modulen, som ingår i Python Imaging Library (PIL).
Jag kommer att lista Python-skriptet först och sedan gå igenom koden steg för steg:
från PIL import Bild från PIL.ExifTags import TAGS image = Image.open ('toy.jpg') info = image._getexif () för tagg, värde i info.items (): key = TAGS.get (tag) om nyckel == 'Gör': Skriv ut (nyckel + ':' + str (värde)) Elif-tangent == 'Modell': Skriv ut (tangent + ':' + str (värde)) Elif-tangent == 'Flash': Skriv ut nyckel + ':' + str (värde))
Det första vi gjorde är att importera Bild
och TAGS
klasser. De Bild
klassen används för att representera en PIL-bild medan TAGS
klass, som nämns i dokumentationen, kartlägger 16-bitars heltal EXIF-tagsräkningar till beskrivande strängnamn.
Vi fortsätter sedan genom att läsa vår bild, toy.jpg
, och använda ._getexif ()
funktion som returnerar en ordlista av taggar och deras värden. Efter det att vi trycker på värdet på taggen (nyckel), kontrollerar vi om den nyckeln finns i bilden som en tagg alls eller inte.
Om du vill ha en lista över tillgängliga taggar i bilden kan du helt enkelt lägga till uttalandet skrivnyckel
under nyckelvariabeln i förbandet. Vilka andra taggar kan du se efter att ha kört detta uttalande?
Kontrollera resultatet av ovanstående skript, det här är vad du skulle få om du använde toy.jpg
:
Flash: 0 Märke: samsung Modell: SAMSUNG-SM-N920A
Från utgången vet vi att mobiltelefonen som användes för att ta det foto vi såg var av typ samsung
och modell SAMSUNG-SM-N920A
. Vad sägs om värdet 0
för taggen Blixt
? Om vi hänvisar till standarddokumentet kopplat i Exif Data-sektionen ovan kommer vi att se det värdet 0
innebär att blixten brandade inte vid tidpunkten för fotograferingen.
Låt oss komma till vårt huvudämne: Anledningen till att du ibland kan hitta den bild du överförde från en mobilkamera som roterats eller med fel orientering. Vi kan upptäcka orsaken till problemet genom att analysera Exif-data i bilden.
En metadata-tagg som vi kan använda för detta ändamål är Orientering
, vilken, baserat på det ovanstående standarddokumentet, visar bildorientering betraktad i termer av rader och kolumner. För att kontrollera orienteringsmärkningens värde för vår bild kan vi lägga till följande påståenden i slutet av ovanstående skript:
elif nyckel == 'Orientering': skriv ut (nyckel + ':' + str (värde))
Ovanstående uttalanden skulle återvända Orientering: 1
. Med hänvisning till Exif-standarddokumentet, värdet 1
betyder:
Den 0: e raden ligger på bildens visuella övre del och den första kolumnen är den visuella vänstra sidan.
För att göra detta tydligare, som beskrivs i Exif Orienteringsmärke, kan beskrivningen ovan läsas enligt följande: 0: e raden i den lagrade bilden är toppen av den upptagna scenen och den 0: e kolumnen i den lagrade bilden är vänster sida av den fångade scenen. Med andra ord har bilden inte roterats i grunden, så vi skulle inte ha några orienteringsproblem när vi överförde bilden från vår mobiltelefon till skrivbordet. JPEG-rotations- och EXIF-orienteringsdokumentet ger en bra förklaring till Exif-orienteringsmärket och dess olika värden.
När du märker att en bild som har överförts från din mobiltelefon har en oväntad rotation eller har fel orientering behöver du bara gå tillbaka till Exif Orientation-taggen och kontrollera dess värde för en viss bild baserat på vilken du kunde korrigera orienteringen på din överförda bild eller någon annan bild du fått från någon annan.
Detta är särskilt fördelaktigt när du applicerar en algoritm på en serie bilder som hämtas från en mobiltelefonkamera och du vill se till att varje bild har sparats med rätt orientering.