Op een dag stuurde mijn vriend me wat afbeeldingen om mijn algoritme te testen. Het algoritme werkte prima, en ik heb alles doorlopen. Bij het analyseren van de resultaten zag ik echter dat sommige afbeeldingen waren geroteerd!
Ik kon de reden echt niet begrijpen. Niets in mijn algoritme heeft rotaties uitgevoerd en het was een beetje raar. Ik heb gelukkig de reden begrepen waarom dit toch is gebeurd, en in dit bericht zal ik je door de stappen leiden die je kunt uitvoeren om afbeeldingen te analyseren die raar worden gedraaid met behulp van Python.
Laten we beginnen!
Heb je ooit nagedacht over wat er gebeurt als je een foto maakt met je mobiele telefooncamera? In dit geval zou de camera de afbeelding naar een beeldbestand schrijven en tegelijkertijd andere informatie in de opgeroepen afbeelding opnemen metadata; kort gezegd, dit zijn gegevens over gegevens. Ons beeld wordt bijvoorbeeld beschouwd als data. Metagegevens kunnen de tijd zijn waarop de afbeelding is gemaakt.
Metagegevens worden naar het afbeeldingsbestand geschreven met behulp van het verwisselbare afbeeldingsbestandsformaat (Exif). Veel interessante metadatatags worden in uw afbeelding opgenomen, zoals de maken en model- van de telefoon die wordt gebruikt om de foto te maken, naast meer interessante tags! Metadata kunnen dus waardevolle informatie over uw afbeelding bevatten.
Als u dieper in Exif-gegevens wilt graven, hebben de Camera and Imaging Products Association (CIPA) en de Vereniging voor Informatietechnologie Industries (JEITA) gezamenlijk de norm geformuleerd: CIPA DC-008-vertaling Verwisselbaar beeldbestandsformaat voor digitale fotocamera's: Exif-versie 2.3.
Nu we weten wat we bedoelen met metadata, laten we doorgaan en enkele metadata-tags in onze afbeelding lezen. Voor deze tutorial gebruik ik de onderstaande afbeelding, die is gemaakt met een mobiele telefooncamera. De originele afbeelding kan worden gedownload van toy.jpg.
Zoals hierboven vermeld, zullen verschillende metadata-tags in de afbeelding worden opgenomen. Laten we een Python-script schrijven dat de informatie van sommige metadatatags uit de bovenstaande afbeelding zou extraheren. Wat betreft de informatie, laten we zeggen dat we meer willen weten over de maken en model- van de mobiele telefoon waarmee de foto is gemaakt, en de flash status op het moment van het nemen van de foto. Daarvoor gaan we de ExifTags-module gebruiken, die deel uitmaakt van de Python Imaging Library (PIL).
Ik zal eerst het Python-script vermelden en vervolgens de code stap voor stap doorlopen:
van PIL importeren Afbeelding van PIL.ExifTags importeren TAGS image = Image.open ('toy.jpg') info = image._getexif () voor tag, waarde in info.items (): key = TAGS.get (tag) als sleutel == 'Make': print (sleutel + ':' + str (waarde)) elif-toets == 'Model': print (toets + ':' + str (waarde)) elif-toets == 'Flash': print ( toets + ':' + str (waarde))
Het eerste dat we hebben gedaan, is het importeren van Beeld
en TAGS
klassen. De Beeld
klasse wordt gebruikt om een PIL-afbeelding weer te geven, terwijl de TAGS
klasse, zoals vermeld in de documentatie, kaart 16-bits integer EXIF-tag-opsommingen naar beschrijvende tekenreeksnamen.
We gaan verder door onze afbeelding te lezen, toy.jpg
, en gebruik de ._getexif ()
functie die een woordenboek van retourneert labels en hun waarden. Daarna controleren we voordat de waarde van het label (sleutel) wordt afgedrukt of die sleutel in het geheel al dan niet als tag in de afbeelding voorkomt.
Als u een lijst met beschikbare tags in de afbeelding wilt hebben, kunt u eenvoudigweg de instructie toevoegen afdruksleutel
onder de hoofdvariabele in de lus. Welke andere tags kun je zien na het uitvoeren van deze verklaring?
Als u de uitvoer van het bovenstaande script controleert, is dit wat u zou krijgen als u het gebruikte toy.jpg
:
Flash: 0 Merk: samsung Model: SAMSUNG-SM-N920A
Aan de uitgang weten we dat de mobiele telefoon die we gebruikten om de foto te nemen die we zagen van het type was samsung
en model SAMSUNG-SM-N920A
. Hoe zit het met de waarde 0
voor de tag Flash
? Als we verwijzen naar het standaarddocument dat is gekoppeld in de sectie Exif Data hierboven, zullen we zien dat de waarde 0
betekent dat de Flits vuurde niet af op het moment van het nemen van de foto.
Laten we eens kijken naar ons hoofdonderwerp: de reden waarom u soms de afbeelding die u hebt overgebracht van een mobiele telefooncamera die wordt geroteerd of met de verkeerde richting vindt. We kunnen de reden voor dit probleem ontdekken door de Exif-gegevens van de afbeelding te analyseren.
Een metadata-tag die we voor dit doel kunnen gebruiken is oriëntering
, die, op basis van het standaard document hierboven gelinkt, de beeldoriëntatie bekeken in termen van rijen en kolommen. Als u de waarde van de Orientation-tag voor onze afbeelding wilt controleren, kunnen we aan het einde van het bovenstaande script de volgende instructies toevoegen:
elif-toets == 'Oriëntatie': print (toets + ':' + str (waarde))
De bovenstaande verklaringen zouden terugkeren Oriëntatie: 1
. Terugverwijzend naar het document met de Exif-normen, de waarde 1
middelen:
De 0e rij bevindt zich aan de visuele bovenkant van de afbeelding en de 0e kolom is de visuele linkerzijde.
Om dit duidelijker te maken, zoals beschreven in Exif Orientation Tag, kan de bovenstaande beschrijving als volgt worden gelezen: De 0e rij in de opgeslagen afbeelding is de bovenkant van de vastgelegde scène en de 0e kolom in de opgeslagen afbeelding is de linkerkant van de vastgelegde scène. Met andere woorden, het beeld is in essentie niet geroteerd, dus we zouden geen oriëntatieproblemen hebben bij het overbrengen van het beeld van onze mobiele telefoon naar de desktop. Het document JPEG-rotatie en EXIF-richting geeft een mooie uitleg van de Exif-oriëntatie-tag en de verschillende waarden ervan.
Wanneer u merkt dat een afbeelding die is overgebracht vanaf uw mobiele telefoon een onverwachte rotatie heeft of een verkeerde oriëntatie heeft, hoeft u alleen maar terug te gaan naar de markering Exif Orientation en de waarde voor een bepaalde afbeelding te controleren op basis van welke u zou kunnen corrigeer de oriëntatie van uw overgedragen afbeelding of een andere afbeelding die u van iemand anders hebt ontvangen.
Dit is met name handig wanneer u een algoritme toepast op een reeks afbeeldingen die u hebt opgehaald van een mobiele-telefooncamera, en u ervoor wilt zorgen dat elke afbeelding in de juiste richting is opgeslagen.