- 1. Image Transformations - Affine og Non-Affine Transformation
- 2. Billedoversættelser - Flytter billedet op, ned, til venstre og til højre
- 3. Rotation af billedet - Spinning af billedet
- 4. Skalering, størrelse og interpolering
- 5. Billedpyramider - En anden måde at ændre størrelse på
- 6. Beskæring - Skæring af det ønskede billedområde
- 7. Aritmetiske operationer til lysere og mørkere billeder
I den forrige tutorial har vi lært om OpenCV og udført nogle grundlæggende billedbehandling ved hjælp af det som grå skalering, farvemætning, histogram, farveområder, RGB-komponent osv. Som fortalt i den foregående tutorial er OpenCV Open Source Commuter Vision Library, som har C ++, Python og Java-grænseflader og understøtter Windows, Linux, Mac OS, iOS og Android. Så det kan let installeres i Raspberry Pi med Python og Linux-miljø. Og Raspberry Pi med OpenCV og tilsluttet kamera kan bruges til at oprette mange realtids billedbehandlingsapplikationer som ansigtsgenkendelse, ansigtslås, genstandssporing, bilnummerpladesporing, hjemmesikkerhedssystem osv.
I denne vejledning skal vi se, hvordan vi skal manipulere billedet ved hjælp af OpenCV. Her lærer vi at anvende følgende funktion på et billede ved hjælp af OpenCV:
- Billedtransformationer - Affine og ikke-Affine Transformation
- Billedoversættelser - Flytter billedet op, ned, til venstre og til højre
- Rotation af billede - Spinning af billedet
- Skalering, ændring af størrelse og interpolation
- Image Pyramids - En anden måde at ændre størrelse på
- Beskæring - Klipning af det ønskede billedområde
- Aritmetiske operationer til lysere og mørkere billeder
1. Image Transformations - Affine og Non-Affine Transformation
Transformationer er geometriske forvrængninger, der er vedtaget på et billede, forvrængninger betyder bestemt ikke her fejl, men en korrektionstype for at rette op på perspektivproblemerne, der opstår fra det punkt, hvor billedet blev taget. Der er to typer billedtransformationer - Affine og Non-Affine
Affinetransformationer er af tre typer skalering, rotation og translation, det vigtigste ved affinetransformationer er, at linjer er parallelle før og efter billedtransformationer.
Ikke-affine transformationer eller projektive transformationer bevarer ikke parallelisme, længde eller vinkel, men det bevarer imidlertid kollineariteten og forekomsten, kollineariteten betyder, at de to punkter ligger på den samme lige linje.
Ikke-affine transformationer er meget almindelige i computersyn og genereres fra forskellige kameravinkler. Ikke-affine eller projektive transformationer kaldes også homografi.
2. Billedoversættelser - Flytter billedet op, ned, til venstre og til højre
Billedoversættelse flytter billedet op, ned, til venstre og til højre og endda diagonalt, hvis vi implementerer x- og y-oversættelse på samme tid.
Nu til udførelse af billedoversættelser bruger vi opencvs warpAffine-funktion, cv2.warpAffine bruges til at implementere disse oversættelser, men til det har vi brug for en oversættelsesmatrix.
Oversættelsesmatrix, T = 1 0 Tx
0 1 ty
T X, T y er de retninger, hvor billedet skifter finder sted.
Hvor T X forskydes langs X-aksen (vandret)
T Y forskydes langs Y-aksen (lodret)
# dette er en affinetransformation, der simpelthen skifter placeringen af et billede # vi bruger cv2.warpAffine til at implementere disse transformationer. import cv2 import numpy som np image = cv2.imread ('input.jpg') # gemme højden og bredden af billedhøjden, bredde = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (billede, T, (bredde, højde)) print (T) cv2.imshow ('original_billede', billede) cv2.waitKey (0) cv2.imshow (' Oversættelse ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Konsoludgang - (183, 275) - højde og bredde
- T-matrix
]
3. Rotation af billedet - Spinning af billedet
Rotation af billedet roterer et billede omkring et punkt eller punktet i midten af billedet, ligesom det roterende punkt fungerer som en drejning.
Som i oversættelse har vi T-matrix, sandsynligvis i rotation har vi M-matrix
Rotationsmatrix, M-matrix = Cosθ-Sinθ
Sinθ Cosθ
Hvor θ er rotationsvinklen målt i retning mod uret.
Der er også en ting at bemærke, at OpenCV giver dig mulighed for at sælge og rotere billedet på samme tid ved hjælp af funktionen cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, rotationsvinkel, skala)
Vi bruger stadig opencv's warpAffine-funktion til at få billedets rotation, men i stedet for oversættelsesmatrix som i tidligere tilfælde her bruger vi rotationsmatrixen.
import cv2 import numpy som np image = cv2.imread ('input.jpg') højde, bredde = image.shape # divider højden og bredden med 2 for at rotere billedet omkring dets center rotation_matrix = cv2.getRotationMatrix2D ((bredde / 2, højde / 2), 90,1) rotated_image = cv2.warpAffine (billede, rotation_matrix, (bredde, højde)) cv2.imshow ('originalbillede', billede) cv2.waitKey (0) cv2.imshow ('roteret billede ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Nu roteres billedet 90 grader, det beskæres på grund af lærredstørrelsen, da lærredstørrelsen forbliver den samme, men på grund af rotation passer billedstørrelsen ikke ind i lærredstørrelsen. Det kunne justeres ved at indstille skaleringsfaktoren til negativ, men det tillader en sort baggrund bag billedet.
Så du kan indstille billedets højde og bredde ved at foregribe det eller gætte det, eller der er en anden metode til at rotere billedet ved at transponere det, men det ville rotere billedet med multipla af 90 grader mod urets retning.
4. Skalering, størrelse og interpolering
Skalering og ændring af størrelse er affine transformationer. Ændring af billedets størrelse er det, vi har gjort en god tid, og vi har også beskæftiget os med interpolering, som når du ændrer størrelsen på billedet til større størrelse, hvor vi udvider pixelerne, er der nogle huller i pixels, og det er her interpolering kommer ind.
Det kan forekomme ved at øge billedstørrelsen fra mindre til større eller mindske billedstørrelsen fra større til mindre.
Teknisk set er interpolering en metode til at konstruere nye datapunkter (pixels) inden for et diskret sæt kendte datapunkter.
Der er forskellige typer interpolationsmetoder i OpenCV som
cv2.INTER_AREA - god til krympning eller nedprøveudtagning
cv2.INTER_NEAREST - hurtigste
cv2.LINEAR - god til zoom eller op til sampling (standard)
cv2.CUBIC - bedre
cv2.INTER_LANCZOS4 - bedst
# resizing er meget let ved hjælp af funktionen cv2.resize, dens argumenter er # cv2.resize (billede, dsize (output billedstørrelse), x_scale, y_scale, interpolation) import cv2 import numpy som np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', billede) cv2.waitKey (0) # lad os gøre billedet 3/4 til den originale billedstørrelse, dvs. skaleres ned til 75% image_scaled = cv2.resize (billede, Ingen, fx = 0,75, fy = 0,75) # da lineær interpolation er standardmetode til åben cv, behøver vi ikke implementere den som en funktion. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # lad os fordoble størrelsen på vores billede img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # lad os ændre størrelsen på nøjagtige dimensioner image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Billedpyramider - En anden måde at ændre størrelse på
Pyramideringsbillede refererer til enten opskalering (forstørrelse af billeder) eller nedskalering (krympende billeder).
Det er simpelthen en anden måde at ændre størrelse på, der giver os mulighed for nemt og hurtigt at skalere billeder og nedskalere og reducere højden og bredden af det nye billede med det halve.
Dette er nyttigt, når du laver objektdetektorer, der skalerer billederne, hver gang det søger efter et objekt.
importer cv2 billede = cv2.imread ('input.jpg') mindre = cv2.pyrDown (billede) større = cv2.pyrUp (mindre) cv2.imshow ('original', billede) cv2.waitKey (0) cv2.imshow ('mindre', mindre) cv2.waitKey (0) cv2.imshow ('større', større) cv2.waitKey (0) cv2.destroyAllWindows ()
I større billede vil du bemærke, at det stadig er af samme størrelse som det originale billede, at det er lidt sløret, fordi det konverteres direkte fra mindre billede til større billede. Men hvis vi interpolerer det, forbedres billedkvaliteten i forhold til den forrige, fordi interpolation estimerer pixel, mens der udfyldes mellemrum, når billedet forstørres.
Kører nu den samme kode, men med kubisk interpolation, giver en bedre kvalitet af det store billede. Nedenstående billeder viser sammenligningen mellem originalbillede, opskaleret version af billede, mindre billede og kubisk interpoleret version af mindre billede.
importer cv2 billede = cv2.imread ('input.jpg') mindre = cv2.pyrDown (billede) større = cv2.pyrUp (mindre) cv2.imshow ('original', billede) cv2.waitKey (0) cv2.imshow ('mindre', mindre) cv2.waitKey (0) cv2.imshow ('større', større) cv2.waitKey (0) # øger kvaliteten af konverteret større billede fra mindre billede ved hjælp af kubisk interpolation img_double = cv2.resize (mindre, Ingen, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
BEMÆRK: Hvis du vil oprette flere små kopier af billeder, der bliver mindre og mindre i størrelse eller flere store kopier af billeder, der konstant vokser i størrelse, kan vi bruge til sløjfer eller mens sløjfer holdes inde i pyrDown- eller pyrUp- funktionen.
6. Beskæring - Skæring af det ønskede billedområde
Beskæring af billeder henviser til udpakning af et billedsegment.
OpenCV har direkte ikke beskæringsfunktion, men det kan let gøres ved bedøvelse ved hjælp af nedenstående kode
Beskåret = billede
Vi sætter billedarrayet og ved hjælp af indekseringsværktøjer eller metode i bedøvelse, vi definerer start række til slut række og start kolonne til slut kolonne adskilt af et komma, der udtrækker det rektangel, vi vil beskære for at få billedet.
import cv2 import numpy som np image = cv2.imread ('input.jpg') højde, bredde = image.shape # lad os få startpixelkoordinaterne (øverst til venstre for beskæringsrektangel) start_row, start_col = int (højde *.25), int (bredde *.25) # lad os få endelige pixelkoordinater (nederst til højre) end_row, end_col = int (højde *.75), int (bredde *.75) # Brug simpelthen indeksering til at beskære det rektangel, vi ønsker beskåret = billede cv2.imshow ("originalt billede", billede) cv2.waitKey (0) cv2.imshow ("beskåret billede", beskåret) cv2.waitKey (0) cv2.destroyAllWindows ()
Bemærk, at du kan bruge pixelværdier direkte i stedet for start_col eller start_row , de gives bare for at få den nemme identifikation for brugeren.
7. Aritmetiske operationer til lysere og mørkere billeder
Aritmetiske operationer i OpenCV er grundlæggende at tilføje eller trække matrixer til billedet, at tilføje eller trække matrixer har effekt på at øge eller mindske lysstyrken.
Så for at tilføje eller trække matrixer er vi nødt til at oprette dem og numpy har en funktion kaldet np.ones, der giver matrixer af 1's samme størrelse som vores billede.
import cv2 import numpy som np image = cv2.imread ('input.jpg') # Opret en matrix af ens, multiplicer den derefter med en skaler på 100 ' # np.ones giver en matrix med samme dimension som vores billede med alle værdierne er 100 i dette tilfælde M = np.ones (image.shape, dtype = "uint8") * 100 # vi bruger dette til at tilføje denne matrix M til vores billede # bemærk stigningen i lysstyrke tilføjet = cv2.add (image, M) cv2.imshow ("Tilføjet", tilføjet) cv2.waitKey (0) # ligeledes kan vi også subtrahere # bemærker faldet i lysstyrke trukket = cv2.subtract (billede, M) cv2.imshow ("trukket", trukket) cv2.waitKey (0) cv2.destroyAllWindows ()
Sådan kan OpenCV bruges til at anvende mange forskellige billedbehandlingsoperationer på billedet. Vi fortsætter med andre billedmanipulationsfunktioner i næste tutorial.