Îmbunătățirea imaginii în Python

Permiteți-mi să încep acest tutorial luând un jargon teoretic din calea ta. Când vorbim de îmbunătățire a imaginii, acest lucru înseamnă în esență că vrem o nouă versiune a imaginii care este mai potrivită decât cea originală. 

De exemplu, când scanați un document, imaginea de ieșire poate avea o calitate mai mică decât imaginea de intrare originală. Așadar, avem nevoie de o modalitate de a îmbunătăți calitatea imaginilor de ieșire, astfel încât acestea să poată fi vizuale mai expresive pentru spectatori, iar în acest caz se pune în joc îmbunătățirea imaginii. Atunci când îmbunătățim o imagine, ceea ce facem este accentuarea caracteristicilor imaginii, cum ar fi contrastul și marginile.

Este important să rețineți că îmbunătățirea imaginii nu mărește conținutul informațional al imaginii, ci mărește mai degrabă intervalul dinamic al caracteristicilor selectate, crescând în cele din urmă calitatea imaginii. De aici, de fapt, nu știm cum ar arăta imaginea de ieșire, dar ar trebui să putem spune (subiectiv) dacă au existat îmbunătățiri sau nu, cum ar fi observarea mai multor detalii în imaginea de ieșire, de exemplu.

Îmbunătățirea imaginii este de obicei utilizată ca o etapă de preprocesare în pașii fundamentali implicați în procesarea digitală a imaginilor (adică segmentarea, reprezentarea). Există multe tehnici de îmbunătățire a imaginii, dar voi fi acoperirea a două tehnici în acest tutorial: imagine inversă și putere de transformare a legii. Vom arunca o privire asupra modului în care le putem implementa în Python. Deci sa începem!

Inversarea imaginii

După cum probabil ați ghicit din titlul acestei secțiuni (care poate fi denumit și negarea imaginii), inversul imaginii are scopul de a transforma intensitățile întunecate din imaginea de intrare la intensitățile luminoase din imaginea de ieșire și intensitățile luminoase ale imaginii de intrare la intensitățile întunecate din imaginea de ieșire. Cu alte cuvinte, zonele întunecate devin mai ușoare, iar zonele luminoase devin mai întunecate.

Spune asta I (i, j) se referă la valoarea de intensitate a pixelului situat la (I, j). Pentru a clarifica un pic aici, valorile intensității din imaginea în tonuri de gri se încadrează în interval [0255], și (I, j) se referă la valorile rândului și coloanei. Când aplicăm operatorul invers al imaginii pe o imagine în tonuri de gri, pixelul de ieșire O (i, j) valoarea va fi:

O (i, j) = 255 - I (i, j)

În ziua de azi, majoritatea imaginilor noastre sunt imagini color. Aceste imagini conțin trei canale, roșu, verde, și albastru, referit ca RGB imagini. În acest caz, spre deosebire de formula de mai sus, trebuie să scădem intensitatea fiecare canal de la 255. Deci imaginea de ieșire va avea următoarele valori la pixel (I, j):

(I, j) = 255-R (i, j) O_G (i, j) = 255-

După această introducere, să vedem cum putem implementa operatorul invers al imaginii în Python. Aș dori să menționez că, din motive de simplitate, voi conduce operatorul pe o imagine în tonuri de gri. Dar vă voi da câteva gânduri despre aplicarea operatorului pe o imagine coloră și voi lăsa întregul program pentru dvs. ca un exercițiu.

Primul lucru pe care trebuie să-l faceți pentru o imagine color este extragerea valorii intensității fiecărui canal de pixel (adică RGB). În acest scop, puteți utiliza Biblioteca de imagini Python (PIL). Mergeți mai departe și descărcați o mostră de baboon imagine de la baboon.png. Dimensiunea imaginii este 500x500. Să presupunem că doriți să extrageți valorile de intensitate roșie, verde și albastră situate la locația pixelilor (325, 432). Acest lucru se poate face după cum urmează:

de la import PIL Imagine im = Image.open ('baboon.png') print im.getpixel ((325,432))

Pe baza documentației, care este metoda getpixel () nu este:

Returnează valoarea pixelului la o poziție dată.

După ce executați scriptul de mai sus, veți observa că obțineți numai următorul rezultat: 138! Dar unde sunt valorile intensității celor trei canale (RGB)? Problema pare a fi cu mod a imaginii citite. Verificați modul executând următoarea instrucțiune:

imprimați im.mode

Veți obține ieșirea P, ceea ce înseamnă că imaginea a fost citită într-un mod paletă. Un lucru pe care îl puteți face este să convertiți imaginea în modul RGB înainte de a reveni la valorile intensității diferitelor canale. Pentru a face acest lucru, puteți utiliza funcția convertit() , după cum urmează:

rgb_im = im.convert ("RGB")

În acest caz, veți primi următoarea valoare: (180, 168, 178). Aceasta înseamnă că valorile intensității pentru canalele roșii, verzi și albastre sunt de 180, 168 și, respectiv, 178.

Pentru a pune împreună tot ceea ce am descris până acum, scriptul Python care ar întoarce valorile RGB ale unei imagini arată după cum urmează:

de la importul PIL Imagine im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') print rgb_im.getpixel ((325,432))

Există un punct de plecare înainte de a vă deplasa înainte la operatorul invers al imaginii. Exemplul de mai sus arată cum se poate obține valoarea RGB de unu numai pixel, dar când efectuați operatorul invers, trebuie să îl efectuați toate pixelii. 

Pentru a imprima toate valorile intensității pentru diferitele canale ale fiecărui pixel, puteți face următoarele:

din import PIL Imagine im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') lățime, înălțime = im.size pentru w în interval (lățime): pentru h în intervalul (înălțimea) rgb_im.getpixel ((w, h))

În acest moment, vă voi lăsa ca un exercițiu pentru a afla cum să aplicați operatorul invers al imaginii pe toate canalele de imagini color (adică RGB) fiecărui pixel.

Să aruncăm o privire la un exemplu care aplică aplicația inversă a imaginii pe o imagine din tonuri de gri. Continuați și descărcați boat.tiff, care va servi ca imagine de test în această secțiune. Asa arata:

O să folosesc scipy bibliotecă pentru această sarcină. Scriptul Python pentru aplicarea operatorului invers al imaginii de pe imaginea de mai sus ar trebui să arate după cum urmează:

import scipy.misc de la scipy import misc de la scipy.misc.pilutil import Imagine im = Image.open ('barca.tiff') im_array = scipy.misc.fromimage (im) im_inverse = 255 - im_array im_result = scipy.misc.toimage (im_inverse) misc.imsave ('result.tiff', im_result)

Primul lucru pe care l-am făcut după citirea imaginii este să-l convertim într-un ndarray pentru a aplica operatorul invers al imaginii pe acesta. După ce aplicăm operatorul, pur și simplu transformăm ndarray-ul într-o imagine și salvăm imaginea ca result.tiff. Figura de mai jos afișează rezultatul aplicării inverse a imaginii de mai sus (imaginea originală este în partea stângă și rezultatul aplicării operatorului invers al imaginii este în partea dreaptă):

Observați că unele caracteristici ale imaginii au devenit mai clare după aplicarea operatorului. Uite, de exemplu, la nori și la farul din dreapta imaginii.

Transformarea Legii Puterii

Acest operator, de asemenea, numit corecție gamma, este un alt operator pe care îl putem folosi pentru a îmbunătăți imaginea. Să vedem ecuația operatorului. La pixel (I, j), operatorul arată după cum urmează:

p (i, j) = kI (i, j) ^ gama

I (i, j) este valoarea intensității la locația imaginii (I, j); și k și gamma sunt constante pozitive. Nu voi intra aici în detalii matematice, dar cred că puteți găsi explicații detaliate despre acest subiect în cărțile de procesare a imaginilor. Cu toate acestea, este important să rețineți că în majoritatea cazurilor, k = 1, astfel încât vom modifica în principal valoarea gammei. Ecuația de mai sus poate fi astfel redusă la:

p (i, j) = I (i, j) ^ gama

O să folosesc OpenCV și NumPy bibliotecile de aici. Puteți verifica cu amabilitate tutorialul meu introducând NumPy dacă trebuie să aflați mai multe despre bibliotecă. Imaginea noastră de testare va fi din nou boat.tiff (continuați și descărcați-o).

Scenariul Python pentru a efectua operatorul Power Law Transformation arată după cum urmează:

cv2.imshow ("Imagine originală", im) cv2.imshow ("Putere") imv cv2.imsh (im " Transformarea Legii ", im_power_law_transformation) cv2.waitKey (0)

Observați că valoarea gamma pe care o alegem este 0.6. Figura de mai jos prezintă imaginea originală și rezultatul aplicării operatorului Power Law Transformation pe acea imagine (imaginea din stânga arată imaginea originală, iar imaginea din dreapta arată rezultatul după aplicarea operatorului de transformare a puterii de putere).

Rezultatul de mai sus a fost când gamma = 0,6. Să vedem ce se întâmplă atunci când creștem gama 1.5, de exemplu:

Observați că, pe măsură ce creștem valoarea gammei, imaginea devine mai întunecată și invers.

S-ar putea întreba ce ar putea fi utilizarea transformării legii puterii. De fapt, diferitele dispozitive utilizate pentru achiziția, imprimarea și afișarea imaginii răspund conform operatorului de transformare a legii de putere. Acest lucru se datorează faptului că creierul uman folosește corecția gama pentru a procesa o imagine. De exemplu, corecția gamma este considerată importantă atunci când dorim ca o imagine să fie afișată corect (cel mai bun contrast de imagine este afișat în toate imaginile) pe un monitor de computer sau pe ecranele televizorului.

Concluzie

În acest tutorial, ați învățat cum să îmbunătățiți imaginile utilizând Python. Ați văzut cum să evidențiați caracteristicile utilizând operatorul invers al imaginii și cum transformarea legii de putere este considerată un operator crucial pentru afișarea corectă a imaginilor pe monitoarele de calculator și pe ecrane de televiziune.

Mai mult decât atât, nu ezitați să vedeți ce avem la dispoziție pentru vânzare și pentru studiul pe piața Envato și vă rugăm să puneți întrebări și să oferiți feedback-ul dvs. valoros folosind feed-ul de mai jos.

Cod