Într-o zi, prietenul meu mi-a trimis niște imagini pentru a-mi testa algoritmul. Algoritmul a funcționat foarte bine și am reușit să trec prin toate. Când am analizat rezultatele, am văzut însă că unele imagini au fost rotite!
Chiar nu am putut înțelege motivul. Nimic din algoritmul meu nu a efectuat rotații și a fost puțin ciudat. Din fericire am reușit să aflu motivul pentru care acest lucru sa întâmplat la urma urmei și în acest post vă voi face pașii pe care îi puteți efectua pentru a analiza imagini care se rotesc ciudat folosind Python.
Să începem!
Te-ai gândit vreodată la ce se întâmplă când faci o fotografie folosind camera foto? În acest caz, camera va scrie imaginea într-un fișier imagine, în timp ce va include în același timp și alte informații din imaginea numită metadate; pe scurt, acestea sunt date despre date. De exemplu, imaginea noastră este considerată date. Metadatele ar putea fi momentul în care a fost preluată imaginea.
Metadatele sunt scrise în fișierul imagine utilizând formatul de fișier imagine de tip Exchangeable (Exif). Multe etichete de metadate interesante vor fi incluse în imaginea dvs., cum ar fi face și model a telefonului folosit pentru a face fotografia, în plus față de tag-uri mai interesante! Astfel, metadatele ar putea include informații valoroase despre imaginea dvs..
Dacă doriți să explorați mai adânc datele Exif, CIPA și Asociația Industriilor de Tehnologia Informației (JEITA) au formulat în comun standardul: CIPA DC-008-Traducere Formatul de fișier imagine schimbabil pentru camere foto digitale: Versiunea Exif 2.3.
Acum, că știm ce înțelegem prin metadate, să mergem mai departe și să citim câteva etichete de metadate în imaginea noastră. În scopul acestui tutorial, utilizez imaginea de mai jos, care a fost făcută cu ajutorul unei camere de telefon mobil. Imaginea originală poate fi descărcată de la toy.jpg.
După cum sa menționat mai sus, în imagine vor fi incluse diferite etichete de metadate. Să scriem un script Python care să extragă informațiile din unele etichete de metadate din imaginea de mai sus. În ceea ce privește informațiile, să spunem că vrem să aflăm mai multe despre face și model a telefonului mobil cu care a fost preluată fotografia și a bliț stare la momentul fotografierii. Pentru aceasta, vom folosi modulul ExifTags, care face parte din Biblioteca Python Imaging Library (PIL).
Voi lista script-ul Python în primul rând și apoi trece codul pas cu pas:
din import PIL Imagine din PIL.ExifTags import TAGS image = Image.open ('toy.jpg') info = image._getexif () pentru tag, valoare în info.items (): key = TAGS.get (tag) == 'Face': print (tasta + ':' + str (valoare)) elif key == 'Model': print (key + ': tasta + ':' + str (valoare))
Primul lucru pe care l-am făcut este importul Imagine
și ETICHETE
clase. Imagine
clasa este folosit pentru a reprezenta o imagine PIL, în timp ce ETICHETE
clasa, așa cum se menționează în documentație, hărți enumerări de tag-uri EXIF pe 16 biți pentru numele descriptiv de șir.
Apoi continuăm citirea imaginii noastre, toy.jpg
, și folosind ._getexif ()
care returnează un dicționar de Etichete si al lor valorile. După aceea, înainte de a tipări valoarea tagului (cheie), verificăm dacă această cheie există în imagine ca o etichetă sau nu.
Dacă doriți să aveți o listă a etichetelor disponibile în imagine, puteți adăuga pur și simplu instrucțiunea tasta de imprimare
sub variabila cheie din for-loop. Ce alte etichete ați putea vedea după executarea acestei instrucțiuni?
Verificând ieșirea scriptului de mai sus, aceasta este ceea ce ați obține dacă ați folosit toy.jpg
:
Flash: 0 Marcă: samsung Model: SAMSUNG-SM-N920A
De la ieșire, știm că telefonul mobil folosit pentru a face fotografia pe care am văzut-o a fost de tip Samsung
și model SAMSUNG-SM-N920A
. Cum rămâne cu valoarea 0
pentru etichetă bliț
? Dacă ne referim la documentul standard legat de secțiunea Exif Data de mai sus, vom vedea că valoarea 0
înseamnă că fulgerul nu a declanșat foc la momentul fotografierii.
Să venim la subiectul nostru principal: motivul pentru care uneori puteți găsi imaginea pe care ați transferat-o de pe o cameră de telefon mobil care este rotită sau orientată greșit. Putem descoperi motivul pentru această problemă prin analizarea datelor Exif ale imaginii.
O etichetă de metadate pe care o putem folosi în acest scop este Orientare
, care, pe baza documentului standard legat mai sus, arată orientarea imaginii văzută în rânduri și coloane. Pentru a verifica valoarea etichetei de orientare pentru imaginea noastră, putem adăuga următoarele instrucțiuni la sfârșitul scriptului de mai sus:
elif key == 'Orientare': print (tasta + ':' + str (valoare))
Declarațiile de mai sus s-ar întoarce Orientare: 1
. Referindu-se la documentul standardelor Exif, valoarea 1
mijloace:
Rândul 0 este la partea superioară a imaginii, iar coloana 0 este partea stângă vizuală.
Pentru a face acest lucru mai clar, așa cum este descris în Exif Orientation Tag, descrierea de mai sus poate fi citită după cum urmează: Rândul 0 din imaginea stocată este partea superioară a scenei capturate, iar coloana 0 din imaginea stocată este partea stângă a scenei capturate. Cu alte cuvinte, imaginea nu a fost rotită în esență, deci nu am avea probleme de orientare atunci când transferăm imaginea de pe telefonul mobil pe desktop. Documentul de rotație JPEG și orientare EXIF oferă o explicație frumoasă a etichetei de orientare Exif și a diferitelor sale valori.
Astfel, atunci când observați că o imagine transferată de pe telefonul dvs. mobil are o rotație neașteptată sau orientare greșită, trebuie doar să reveniți la eticheta Exif Orientation și să verificați valoarea pentru o anumită imagine, pe baza căreia ați putea corectați orientarea imaginii transferate sau orice altă imagine pe care ați primit-o de la altcineva.
Acest lucru este deosebit de benefic atunci când aplicați un algoritm pe un lot de imagini preluate de pe o cameră de telefon mobil și doriți să vă asigurați că fiecare imagine a fost salvată cu orientarea corectă.