- 1. Transformări de imagine - Transformare afină și non-afină
- 2. Traduceri imagine - Mișcarea imaginii în sus, în jos, la stânga și la dreapta
- 3. Rotirea imaginii - Rotirea imaginii
- 4. Scalare, redimensionare și interpolare
- 5. Piramide de imagine - Un alt mod de redimensionare
- 6. Decupare - Decuparea regiunii de imagine dorită
- 7. Operații aritmetice pentru iluminarea și întunecarea imaginilor
În tutorialul anterior, am învățat despre OpenCV și am făcut câteva prelucrări de bază ale imaginii folosindu-l, cum ar fi scalarea gri, saturația culorilor, histograma, spațiile de culoare, componenta RGB etc. După cum am spus în tutorialul anterior, OpenCV este Open Source Commuter Vision Library care are C ++, Python și interfețele Java și acceptă Windows, Linux, Mac OS, iOS și Android. Deci, poate fi instalat cu ușurință în Raspberry Pi cu mediul Python și Linux. Și Raspberry Pi cu OpenCV și cameră atașată poate fi folosit pentru a crea multe aplicații de procesare a imaginilor în timp real, cum ar fi detectarea feței, blocarea feței, urmărirea obiectelor, detectarea plăcilor de înmatriculare a mașinii, sistemul de securitate la domiciliu etc.
În acest tutorial, vom vedea cum vom manipula imaginea folosind OpenCV. Aici vom învăța să aplicăm următoarea funcție pe o imagine folosind OpenCV:
- Transformări de imagine - Transformare afină și non-afină
- Traduceri imagine - Mișcarea imaginii în sus, în jos, la stânga și la dreapta
- Rotirea imaginii - Rotirea imaginii
- Scalare, redimensionare și interpolare
- Piramide de imagine - Un alt mod de redimensionare
- Decupare - Decuparea regiunii de imagine dorită
- Operații aritmetice pentru iluminarea și întunecarea imaginilor
1. Transformări de imagine - Transformare afină și non-afină
Transformările sunt distorsiuni geometrice adoptate asupra unei imagini, distorsiunile cu siguranță aici nu înseamnă greșeli, ci un tip de corecție pentru a corecta problemele de perspectivă apărute din punctul în care a fost capturată imaginea. Există două tipuri de transformări de imagine - afine și non-afine
Transformările afine sunt de trei tipuri scalare, rotație și translație, ceea ce este important în transformările afine este că liniile sunt paralele înainte și după transformările imaginii.
Transformările non-afine sau transformările proiective nu păstrează paralelismul, lungimea sau unghiul, însă păstrează colinearitatea și incidența, colinearitatea înseamnă că cele două puncte se află pe aceeași linie dreaptă.
Transformările non-afine sunt foarte frecvente în vederea computerizată și sunt generate din diferite unghiuri ale camerei. Transformările non-afine sau proiective se mai numesc și omografie.
2. Traduceri imagine - Mișcarea imaginii în sus, în jos, la stânga și la dreapta
Traducerea imaginii deplasează imaginea în sus, în jos, la stânga și la dreapta și chiar diagonală dacă implementăm traducerea x și y în același timp.
Acum pentru efectuarea traducerilor de imagini folosim funcția warpAffine a opencv, cv2.warpAffine este folosit pentru a implementa aceste traduceri, dar pentru aceasta avem nevoie de o matrice de traducere.
Matricea de traducere, T = 1 0 Tx
0 1 ty
T X, T y sunt direcțiile în care se schimbă imaginea.
În care T X este deplasat de-a lungul axei X (orizontală)
T Y este deplasat de-a lungul axei Y (vertical)
# aceasta este o transformare afină care schimbă pur și simplu poziția unei imagini # folosim cv2.warpAffine pentru a implementa aceste transformări. import cv2 import numpy as np image = cv2.imread ('input.jpg') # stochează înălțimea și lățimea înălțimii imaginii , lățimea = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (imagine, T, (lățime, înălțime)) print (T) cv2.imshow ('original_image', image) cv2.waitKey (0) cv2.imshow (' Traducere ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Ieșire consolă - (183, 275) - înălțime și lățime
- matricea T
]
3. Rotirea imaginii - Rotirea imaginii
Rotația imaginii este rotirea unei imagini despre un punct sau punctul din centrul imaginii, la fel cum punctul de rotație acționează ca un pivot.
Ca și în traducere avem matricea T, probabil în rotație avem matricea M
Matricea de rotație, matricea M = Cosθ -Sinθ
Sinθ Cosθ
Unde θ este unghiul de rotație, măsurat în sens invers acelor de ceasornic.
De asemenea, există un lucru de menționat că OpenCV vă permite să vindeți și să rotiți imaginea în același timp folosind funcția, cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, angle de rotație, scale)
Încă folosim funcția warpAffine a opencv pentru a obține rotația imaginii, dar în loc de matricea de traducere, ca în cazul anterior, folosim matricea de rotație.
import cv2 import numpy ca np image = cv2.imread ('input.jpg') înălțime, lățime = image.shape # împarte înălțimea și lățimea cu 2 pentru a roti imaginea în jurul centrului său, înălțimea / 2), 90,1) rotated_image = cv2.warpAffine (imagine, rotation_matrix, (lățime, înălțime)) cv2.imshow ('imaginea originală', imagine) cv2.waitKey (0) cv2.imshow ("imagine rotită ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Acum imaginea este rotită cu 90 de grade, este decupată din cauza dimensiunii pânzei, deoarece dimensiunea pânzei rămâne aceeași, dar datorită rotației, dimensiunea imaginii nu se potrivește cu dimensiunea pânzei. Poate fi ajustat setând factorul de scalare la negativ, dar permite un fundal negru în spatele imaginii.
Deci, puteți seta înălțimea și lățimea imaginii anticipând-o sau ghicind-o sau există o altă metodă de rotire a imaginii prin transpunere, dar ar roti imaginea cu multiplii de 90 de grade în sens invers acelor de ceasornic.
4. Scalare, redimensionare și interpolare
Scalarea și redimensionarea sunt transformări afine, redimensionarea imaginii este ceea ce am făcut destul de mult și ne-am ocupat și de interpolare, cum ar fi când redimensionați imaginea la dimensiuni mai mari în care extindem pixelii, există unele lacune în pixeli și acolo intervine interpolare.
Poate apărea la mărirea dimensiunii imaginii de la mai mică la mai mare sau la scăderea dimensiunii imaginii de la mai mare la mai mică.
Din punct de vedere tehnic, interpolare este o metodă de a construi noi puncte de date (pixeli), în cadrul unui set discret de puncte de date cunoscute.
Există diferite tipuri de metode de interpolare în OpenCV cum ar fi
cv2.INTER_AREA - bun pentru reducere sau prelevare de probe
cv2.INTER_NEAREST - cel mai rapid
cv2.LINEAR - bun pentru zoom sau prelevare de probe (implicit)
cv2.CUBIC - mai bine
cv2.INTER_LANCZOS4 - cel mai bun
# redimensionarea este foarte ușoară folosind funcția cv2.resize, argumentele sale sunt # cv2.resize (imagine, dsize (dimensiunea imaginii de ieșire), x_scale, y_scale, interpolare) import cv2 import numpy ca np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # haideți să facem imaginea 3/4 dimensiunea originală a imaginii, adică scade până la 75% image_scaled = cv2.resize (imagine, None, fx = 0,75, fy = 0,75) #deoarece interpolare liniară este metoda implicită pentru cv deschis nu este nevoie să o implementăm ca o funcție. cv2.imshow ('scalare_interpolare liniară', imagine_scaled) cv2.waitKey (0) # să dublăm dimensiunea imaginii noastre img_double = cv2.resize (imagine, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # haideți să redimensionăm prin dimensiuni exacte image_resize = cv2.resize (imagine, (200.300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Piramide de imagine - Un alt mod de redimensionare
Imaginea piramidală se referă fie la redimensionare (mărire a imaginilor), fie reducere (reducere a imaginilor).
Este pur și simplu un mod diferit de redimensionare care ne permite să redimensionăm cu ușurință și rapid imaginile, reducând dimensiunea reducând înălțimea și lățimea noii imagini la jumătate.
Acest lucru este util atunci când realizați detectoare de obiecte care redimensionează imaginile de fiecare dată când caută un obiect.
importă imaginea cv2 = cv2.imread ('input.jpg') mai mică = cv2.pyrDown (imagine) mai mare = cv2.pyrUp (mai mică) cv2.imshow ('original', imagine) cv2.waitKey (0) cv2.imshow („mai mic”, mai mic) cv2.waitKey (0) cv2.imshow („mai mare”, mai mare) cv2.waitKey (0) cv2.destroyAllWindows ()
În imagini mai mari, veți observa că încă având aceeași dimensiune a imaginii originale, este puțin neclară, deoarece este convertită direct din imagine mai mică în imagine mai mare. Dar dacă o interpolăm, calitatea imaginii devine îmbunătățită ca și cea anterioară, deoarece interpolația estimează pixelii în timp ce completează spațiile când imaginea este mărită.
Acum, rularea aceluiași cod, dar cu interpolare cubică, oferă o calitate mai bună a imaginii mari. Imaginile de mai jos prezintă comparația între imaginea originală, versiunea mărită a imaginii, imaginea mai mică și versiunea interpolată cubică a imaginii mai mici.
importă imaginea cv2 = cv2.imread ('input.jpg') mai mică = cv2.pyrDown (imagine) mai mare = cv2.pyrUp (mai mică) cv2.imshow ('original', imagine) cv2.waitKey (0) cv2.imshow („mai mic”, mai mic) cv2.waitKey (0) cv2.imshow („mai mare”, mai mare) cv2.waitKey (0) # creșterea calității imaginii mai mari convertite din imagini mai mici utilizând interpolare cubică img_double = cv2.resize (mai mici, Niciuna, fx = 2, fy = 2, interpolare = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
NOTĂ: Dacă doriți să creați mai multe copii mici ale imaginilor care au dimensiuni din ce în ce mai mici sau mai multe copii mari ale imaginilor în continuă creștere, atunci le putem folosi pentru bucle sau în timp ce buclele păstrează în funcția pyrDown sau pyrUp .
6. Decupare - Decuparea regiunii de imagine dorită
Decuparea imaginilor se referă la extragerea unui segment de imagine.
OpenCV direct nu are funcția de decupare, dar poate fi realizat cu ușurință prin numpy folosind codul de mai jos
Decupat = imagine
Punem matricea de imagini și folosind instrumente sau metode de indexare în numpy, definim rândul de început la rândul de la capăt și începem coloana la capăt coloana separată printr-o virgulă care extrage dreptunghiul pe care dorim să-l decupăm pentru a obține imaginea.
import cv2 import numpy ca np image = cv2.imread ('input.jpg') înălțime, lățime = image.shape # hai să obținem coordonatele pixelului inițial (stânga sus al dreptunghiului de tăiere ) start_row, start_col = int (înălțime *.25), int (lățime *.25) # haideți să obținem coordonatele pixelului de final (dreapta jos) end_row, end_col = int (înălțime *.75), int (lățime *.75) # folosiți doar indexarea pentru a decupa dreptunghiul pe care dorim să îl decupăm = imagine cv2.imshow („imagine originală”, imagine) cv2.waitKey (0) cv2.imshow („imagine decupată”, decupată) cv2.waitKey (0) cv2.destroyAllWindows ()
Notă puteți utiliza valorile pixelilordirectloc de START_COL sau START_ROW , acestea sunt doar pentru a obține dateidentificare ușor pentru utilizator.
7. Operații aritmetice pentru iluminarea și întunecarea imaginilor
Operațiunile aritmetice din OpenCV sunt practic adăugarea sau scăderea matricelor la imagine, adăugarea sau scăderea matricelor are efect asupra creșterii sau scăderii luminozității.
Deci, pentru a adăuga sau scădea matrice trebuie să le creăm și numpy are o funcție numită np.ones care oferă matrice de aceeași dimensiune ca și imaginea noastră.
import cv2 import numpy as np image = cv2.imread ('input.jpg') #create a matrix of one, apoi multiplicați-o cu un scaler de 100 ' # np.ones oferă o matrice cu aceeași dimensiune ca a imaginii noastre cu toate valorile fiind 100 în acest caz M = np.ones (image.shape, dtype = "uint8") * 100 #utilizăm acest lucru pentru a adăuga această matrice M la imaginea noastră # observați creșterea luminozității adăugată = cv2.add (imagine, M) cv2.imshow ("Added", a adăugat) cv2.waitKey (0) #likewise putem de asemenea scădem #notice scăderea luminozității scade = cv2.subtract (imagine, M) cv2.imshow ("scăzută", scade) cv2.waitKey (0) cv2.destroyAllWindows ()
Acesta este modul în care OpenCV poate fi folosit pentru a aplica multe operații diferite de procesare a imaginii pe imagine. Vom continua cu alte funcții de manipulare a imaginii în următorul tutorial.