- 1. Transformacions d’imatges: transformació afí i no afí
- 2. Traduccions d'imatges: desplaçament de la imatge cap amunt, cap avall, esquerra i dreta
- 3. Rotació de la imatge: girar la imatge
- 4. Escalat, redimensionament i interpolació
- 5. Piràmides d’imatges: una altra forma de canviar la mida
- 6. Retallar: retallar la regió d'imatge que desitgeu
- 7. Operacions aritmètiques per il·luminar i enfosquir imatges
En el tutorial anterior, hem après sobre OpenCV i fet alguna imatge bàsiques de processament d'usar-lo com a escala gris, saturació de color, histograma, espais de color, component RGB etc. Com va dir en el tutorial anterior, OpenCV és Open Source de rodalies Biblioteca visió que té Les interfícies C ++, Python i Java són compatibles amb Windows, Linux, Mac OS, iOS i Android. Per tant, es pot instal·lar fàcilment a Raspberry Pi amb entorns Python i Linux. I Raspberry Pi amb OpenCV i càmera connectada es pot utilitzar per crear moltes aplicacions de processament d’imatges en temps real, com ara detecció de cares, bloqueig de cares, seguiment d’objectes, detecció de matrícules de cotxes, sistema de seguretat domèstica, etc.
En aquest tutorial, veurem com manipularem la imatge mitjançant OpenCV. Aquí aprendrem a aplicar la següent funció a una imatge mitjançant OpenCV:
- Transformacions d’imatges: transformació afí i no afí
- Traduccions d'imatges: desplaçament de la imatge cap amunt, cap avall, esquerra i dreta
- Rotació de la imatge: girar la imatge
- Escala, redimensionament i interpolació
- Piràmides d’imatges: una altra forma de canviar la mida
- Retallar: retallar la regió de la imatge que desitgeu
- Operacions aritmètiques per il·luminar i enfosquir imatges
1. Transformacions d’imatges: transformació afí i no afí
Les transformacions són distorsions geomètriques promulgades sobre una imatge, les distorsions certament aquí no signifiquen errors, sinó un tipus de correcció per corregir els problemes de perspectiva derivats del punt on es va capturar la imatge. Hi ha dos tipus de transformacions d’imatges : afines i no afines
Les transformacions afines són de tres tipus: escala, rotació i translació, l’important en les transformacions afines és que les línies siguin paral·leles abans i després de les transformacions d’imatges.



Les transformacions no afines o les transformacions projectives no preserven el paral·lelisme, la longitud o l’angle, però conserven la colinearitat i la incidència, la colineari significa que els dos punts es troben en la mateixa línia recta.
Les transformacions no afines són molt freqüents en la visió per ordinador i es generen des de diferents angles de càmera. Les transformacions no afines o projectives també s’anomenen homografia.

2. Traduccions d'imatges: desplaçament de la imatge cap amunt, cap avall, esquerra i dreta
La traducció d’imatges mou la imatge cap amunt, cap avall, esquerra i dreta i fins i tot en diagonal si implementem la traducció x i alhora.
Ara per realitzar traduccions d’imatges fem servir la funció warpAffine d’opencv, s’utilitza cv2.warpAffine per implementar aquestes traduccions, però per a això necessitem una matriu de traducció.
Matriu de traducció, T = 1 0 Tx
0 1 ty
T X, T y són les direccions en què té lloc la imatge.
En què la T X es desplaça al llarg de l'eix X (horitzontal)
T Y es desplaça al llarg de l'eix Y (vertical)
# es tracta d'una transformació afí que simplement canvia la posició d'una imatge # utilitzem cv2.warpAffine per implementar aquestes transformacions. import cv2 import numpy as np image = cv2.imread ('input.jpg') # emmagatzema l'alçada i l'amplada de l'alçada de la imatge , width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (imatge, T, (amplada, alçada)) imprimir (T) cv2.imshow ('imatge_original', imatge) cv2.waitKey (0) cv2.imshow (' Traducció ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()

Sortida de la consola - (183, 275) - alçada i amplada
- Matriu T.
]
3. Rotació de la imatge: girar la imatge
La rotació de la imatge fa girar una imatge sobre un punt o el punt al centre de la imatge, de la mateixa manera que el punt de rotació actua com un pivot.
Igual que en la traducció tenim matriu T, probablement en rotació tinguem matriu M
Matriu de rotació, matriu M = Cosθ -Sinθ
Sinθ Cosθ
On θ és l’angle de rotació, mesurat en sentit antihorari.
També hi ha una cosa a tenir en compte que OpenCV permet vendre i girar la imatge al mateix temps mitjançant la funció cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, angle de rotació, escala)
Encara fem servir la funció warpAffine d’opencv per obtenir la rotació de la imatge, però en lloc de la matriu de traducció, com en el cas anterior, fem servir la matriu de rotació.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape #divide l'alçada i l'amplada per 2 per girar la imatge al voltant del centre rotation_matrix = cv2.getRotationMatrix2D ((width / 2, altura / 2), 90,1) rotated_image = cv2.warpAffine (image, rotation_matrix, (width, height)) cv2.imshow ('imatge original', imatge) cv2.waitKey (0) cv2.imshow ('imatge rotada ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()

Ara la imatge es gira 90 graus, es retalla a causa de la mida del llenç, ja que la mida del llenç continua sent la mateixa, però a causa de la rotació, la mida de la imatge no s’adapta a la mida del llenç. Es podria ajustar configurant el factor d’escala a negatiu, però permet un fons negre darrere de la imatge.
Per tant, podeu definir l’alçada i l’amplada de la imatge anticipant-la o endevinant-la o hi ha un altre mètode de rotació de la imatge mitjançant la transposició, però giraria la imatge pels múltiples de 90 graus en sentit antihorari.

4. Escalat, redimensionament i interpolació
L’escala i el canvi de mida són transformacions afins, la mida de la imatge és el que hem fet força temps i també ens hem ocupat de la interpolació, com quan canvieu la mida de la imatge a una mida més gran en la qual estem ampliant els píxels, hi ha píxels i aquí entra la interpolació.
Pot ocórrer en augmentar la mida de la imatge de més petita a més gran o en disminuir la mida de la imatge de més gran a menor.
Tècnicament, la interpolació és un mètode de construcció de nous punts de dades (píxels), dins d’un conjunt discret de punts de dades coneguts.
Hi ha diversos tipus de mètodes d'interpolació a OpenCV, com ara
cv2.INTER_AREA: és bo per reduir o baixar el mostreig
cv2.INTER_NEAREST: més ràpid
cv2.LINEAR: bo per ampliar o ampliar el mostreig (predeterminat)
cv2.CUBIC: millor
cv2.INTER_LANCZOS4: el millor
# canviar la mida és molt fàcil mitjançant la funció cv2.resize, els seus arguments són # cv2.resize (imatge, dsize (mida de la imatge de sortida), x_scale, y_scale, interpolation) import cv2 import numpy as np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # fem que la imatge 3/4 sigui la mida original de la imatge, és a dir, redueixi al 75% image_scaled = cv2.resize (imatge, Cap, fx = 0,75, fy = 0,75) # ja que la interpolació lineal és el mètode predeterminat per a cv obert no cal que la implementem com a funció. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # duplicem la mida de la nostra imatge img_double = cv2.resize (imatge, Cap, fx = 2, fy = 2, interpolació = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # fem el canvi de mida per dimensions exactes image_resize = cv2.resize (imatge, (200.300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()



5. Piràmides d’imatges: una altra forma de canviar la mida
La imatge piramidal es refereix a la reducció de l’escala (ampliació d’imatges) o a la reducció de l’escala (reducció d’imatges).
És simplement una forma diferent de canviar la mida que ens permet escalar fàcilment i ràpidament les imatges, reduint la mida reduint l’alçada i l’amplada de la nova imatge a la meitat.
Això és útil quan es fan detectors d’objectes que escalen les imatges cada vegada que busca un objecte.
importa cv2 imatge = cv2.imread ('input.jpg') més petit = cv2.pyrDown (imatge) més gran = cv2.pyrUp (més petit) cv2.imshow ('original', imatge) cv2.waitKey (0) cv2.imshow ("més petit", més petit) cv2.waitKey (0) cv2.imshow ("més gran", més gran) cv2.waitKey (0) cv2.destroyAllWindows ()


En una imatge més gran, notareu que encara té la mateixa mida que la imatge original, és poc borrosa perquè es converteix directament en imatge més petita a imatge més gran. Però si l’interpolem, la qualitat de la imatge es millora a partir de l’anterior perquè la interpolació estima els píxels mentre s’omplen els espais quan s’amplia la imatge.
Ara executant el mateix codi, però amb interpolació cúbica, es dóna una millor qualitat d'imatge gran. A continuació, les imatges mostren la comparació entre la imatge original, la versió ampliada de la imatge, la imatge més petita i la versió interpolada cúbica de la imatge més petita.
importa cv2 imatge = cv2.imread ('input.jpg') més petit = cv2.pyrDown (imatge) més gran = cv2.pyrUp (més petit) cv2.imshow ('original', imatge) cv2.waitKey (0) cv2.imshow ("més petit", més petit) cv2.waitKey (0) cv2.imshow ("més gran", més gran) cv2.waitKey (0) # augmentant la qualitat de la imatge més gran convertida des de la imatge més petita mitjançant la interpolació cúbica img_double = cv2.resize (més petit, Cap, fx = 2, fy = 2, interpolació = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()


NOTA: Si voleu crear diverses còpies petites d'imatges de mida cada vegada més petita o diverses còpies grans d'imatges que creixen contínuament, podem utilitzar-les per a bucles o mentre es mantenen bucles dins de lafunció pyrDown o pyrUp .
6. Retallar: retallar la regió d'imatge que desitgeu
El retall d’imatges fa referència a l’extracció d’un segment d’imatge.
OpenCV directament no té funció de retallar, però es pot fer fàcilment mitjançant numpy mitjançant el codi següent
Retallada = imatge

Posem la matriu d’imatges i mitjançant eines o mètodes d’indexació en numpy, definim fila d’inici a fila final i columna d’inici a columna final separada per una coma que extreu el rectangle que volem retallar per obtenir la imatge.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape # obtenim les coordenades inicials del píxel (a la part superior esquerra del rectangle de retallada) start_row, start_col = int (height *.25), int (ample *.25) # obtinguem coordenades de píxel finals (part inferior dreta) fila_final, final_col = int (alçada *.75), int (amplada *.75) # utilitzeu simplement la indexació per retallar el rectangle que desitgem retallar = imatge cv2.imshow ("imatge original", imatge) cv2.waitKey (0) cv2.imshow ("imatge retallada", retallada) cv2.waitKey (0) cv2.destroyAllWindows ()

Tingueu en compte que podeu utilitzar valors de píxels directament en lloc de start_col o start_row , només es proporcionen per obtenir una identificació fàcil per a l'usuari.
7. Operacions aritmètiques per il·luminar i enfosquir imatges
Les operacions aritmètiques a OpenCV bàsicament són afegir o restar matrius a la imatge, afegir o restar matrius té efecte en augmentar o disminuir la brillantor.
Per tant, per sumar o restar matrius hem de crear-los i numpy té una funció anomenada np.ones que dóna matrius de la mateixa mida de 1 que la nostra imatge.
import cv2 import numpy as np image = cv2.imread ('input.jpg') #create a matrix of one, a continuació, multiplica-la per un escalador de 100 ' # np.ones dóna una matriu amb la mateixa dimensió que la nostra els valors són 100 en aquest cas M = np.ones (image.shape, dtype = "uint8") * 100 # l'utilitzem per afegir aquesta matriu M a la nostra imatge # notar l'increment de la brillantor afegit = cv2.add, M) cv2.imshow ("Afegit", afegit) cv2.waitKey (0) #d'igual manera també podem restar #notice la disminució de la brillantor restada = cv2.subtract (imatge, M) cv2.imshow ("restada", restada) cv2.waitKey (0) cv2.destroyAllWindows ()
Així es pot utilitzar OpenCV per aplicar moltes operacions de processament d'imatges diferents a la imatge. Continuarem amb altres funcions de manipulació d’imatges al proper tutorial.
