- 1. Beeldtransformaties - Affiene en niet-affiene transformatie
- 2. Beeldvertalingen - Beeld omhoog, omlaag, naar links en naar rechts verplaatsen
- 3. Rotatie van de afbeelding - De afbeelding draaien
- 4. Schalen, vergroten of verkleinen en interpoleren
- 5. Afbeeldingspiramides - Een andere manier om het formaat te wijzigen
- 6. Bijsnijden - Het gewenste beeldgebied uitsnijden
- 7. Rekenkundige bewerkingen voor het lichter en donkerder maken van afbeeldingen
In de vorige tutorial hebben we geleerd over OpenCV en hebben we wat basisbeeldverwerking gedaan, zoals grijsschaal, kleurverzadiging, histogram, kleurruimten, RGB-component enz. Zoals verteld in de vorige tutorial, is OpenCV Open Source Commuter Vision Library die C ++, Python en Java-interfaces en ondersteunt Windows, Linux, Mac OS, iOS en Android. Het kan dus eenvoudig worden geïnstalleerd in Raspberry Pi met Python- en Linux-omgeving. En Raspberry Pi met OpenCV en aangesloten camera kan worden gebruikt om veel realtime beeldverwerkingstoepassingen te maken, zoals gezichtsdetectie, gezichtsvergrendeling, objecttracering, auto nummerplaat detectie, huisbeveiligingssysteem etc.
In deze tutorial gaan we zien hoe we de afbeelding gaan manipuleren met OpenCV. Hier zullen we leren om de volgende functie op een afbeelding toe te passen met OpenCV:
- Beeldtransformaties - Affiene en niet-affiene transformatie
- Beeldvertalingen - Beeld omhoog, omlaag, naar links en naar rechts verplaatsen
- Rotatie van afbeelding - De afbeelding draaien
- Schalen, vergroten / verkleinen en interpoleren
- Afbeeldingspiramides - Een andere manier om het formaat te wijzigen
- Bijsnijden - Het gewenste beeldgebied uitsnijden
- Rekenkundige bewerkingen voor het helderder en donkerder maken van afbeeldingen
1. Beeldtransformaties - Affiene en niet-affiene transformatie
Transformaties zijn geometrische vervormingen die op een afbeelding worden uitgeoefend, vervormingen betekenen hier zeker geen fouten, maar een correctietype om de perspectiefproblemen te corrigeren die ontstaan vanaf het punt waar de afbeelding werd vastgelegd. Er zijn twee soorten afbeeldingstransformaties : affiene en niet-affiene
Affiene transformaties zijn van drie soorten: schaalvergroting, rotatie en translatie, het belangrijkste bij affiene transformaties is dat lijnen parallel zijn voor en na beeldtransformaties.
Niet-affiene transformaties of projectieve transformaties behouden geen parallellisme, lengte of hoek, het behoudt echter de collineariteit en incidentie, collineariteit betekent dat de twee punten op dezelfde rechte lijn liggen.
Niet-affiene transformaties komen veel voor in computervisie en worden gegenereerd vanuit verschillende camerahoeken. Niet-affiene of projectieve transformaties worden ook wel homografie genoemd.
2. Beeldvertalingen - Beeld omhoog, omlaag, naar links en naar rechts verplaatsen
Beeldvertaling is het verplaatsen van het beeld naar boven, beneden, links en rechts en zelfs diagonaal als we x- en y-vertaling tegelijkertijd implementeren.
Voor het uitvoeren van afbeeldingsvertalingen gebruiken we de warpAffine-functie van opencv, cv2.warpAffine wordt gebruikt om deze vertalingen te implementeren, maar daarvoor hebben we een vertaalmatrix nodig.
Vertaalmatrix, T = 1 0 Tx
0 1 ty
T X, T y zijn de richtingen waarin de beeldverschuivingen plaatsvinden.
Waarin de T X verschuiving is langs de X-as (horizontaal)
T Y is verschuiving langs de Y-as (verticaal)
# dit is een affiene transformatie die simpelweg de positie van een afbeelding verschuift. # we gebruiken cv2.warpAffine om deze transformaties te implementeren. import cv2 import numpy als np image = cv2.imread ('input.jpg') # bewaar de hoogte en breedte van de afbeelding hoogte, breedte = image.shape print (image.shape) quater_height, quater_width = hoogte / 4, breedte / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (afbeelding, T, (breedte, hoogte)) print (T) cv2.imshow ('originele_afbeelding', afbeelding) cv2.waitKey (0) cv2.imshow (' Vertaling ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Console-uitgang - (183, 275) - hoogte en breedte
- T-matrix
]
3. Rotatie van de afbeelding - De afbeelding draaien
Rotatie van de afbeelding is het roteren van een afbeelding rond een punt of het punt in het midden van de afbeelding, net zoals het roterende punt fungeert als een draaipunt.
Net als bij vertaling hebben we T-matrix, waarschijnlijk hebben we in rotatie M-matrix
Rotatiematrix, M-matrix = Cosθ -Sinθ
Sinθ Cosθ
Waar de θ de rotatiehoek is, gemeten tegen de klok in.
Er is ook een ding om op te merken dat OpenCV u in staat stelt om afbeeldingen tegelijkertijd te verkopen en te roteren met behulp van de functie, cv2.getRotationMatrix2D (rotatie_centrum_x , rotatie_centrum_y, rotatiehoek, schaal)
We gebruiken nog steeds de warpAffine-functie van opencv om de rotatie van de afbeelding te krijgen, maar in plaats van de vertaalmatrix zoals in het vorige geval gebruiken we hier de rotatiematrix.
import cv2 import numpy als np image = cv2.imread ('input.jpg') hoogte, breedte = image.shape #deel de hoogte en breedte door 2 om de afbeelding rond het midden te roteren rotatie_matrix = cv2.getRotationMatrix2D ((breedte / 2, hoogte / 2), 90,1) rotated_image = cv2.warpAffine (afbeelding, rotatie_matrix, (breedte, hoogte)) cv2.imshow ('originele afbeelding', afbeelding) cv2.waitKey (0) cv2.imshow ('geroteerde afbeelding ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Nu wordt de afbeelding 90 graden gedraaid, deze wordt bijgesneden vanwege de canvasgrootte, aangezien de canvasgrootte hetzelfde blijft, maar door rotatie past de afbeeldingsgrootte niet in de canvasgrootte. Het kan worden aangepast door de schaalfactor in te stellen op negatief, maar het laat een zwarte achtergrond achter de afbeelding toe.
U kunt dus de hoogte en breedte van de afbeelding instellen door erop te anticiperen of te raden, of er is een andere methode om de afbeelding te roteren, door deze te transponeren, maar het zou de afbeelding met een veelvoud van 90 graden tegen de klok in draaien.
4. Schalen, vergroten of verkleinen en interpoleren
Schalen en vergroten / verkleinen zijn affiene transformaties, het formaat van de afbeelding wijzigen is wat we al een hele tijd hebben gedaan en we hebben ook te maken gehad met interpolatie, zoals wanneer je het formaat van de afbeelding wijzigt naar een groter formaat waarin we de pixels uitbreiden, er zijn enkele hiaten in de pixels en dat is waar interpolatie om de hoek komt kijken.
Het kan voorkomen bij het vergroten van de afbeeldingsgrootte van kleiner naar groter of het verkleinen van de afbeeldingsgrootte van groter naar kleiner.
Technisch gezien is interpolatie een methode om nieuwe datapunten (pixels) te construeren, binnen een discrete set van bekende datapunten.
Er zijn verschillende soorten interpolatiemethoden in OpenCV, zoals
cv2.INTER_AREA - goed voor het verkleinen of verlagen van steekproeven
cv2.INTER_NEAREST - snelste
cv2.LINEAR - goed voor inzoomen of opwaartse sampling (standaard)
cv2.CUBIC - beter
cv2.INTER_LANCZOS4 - beste
# formaat wijzigen is heel eenvoudig met de functie cv2.resize, de argumenten zijn # cv2.resize (image, dsize (output image size), x_scale, y_scale, interpolation) import cv2 import numpy als np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # laten we de afbeelding 3/4 van de oorspronkelijke afbeeldingsgrootte maken, dwz schalen tot 75% image_scaled = cv2.resize (afbeelding, Geen, fx = 0.75, fy = 0.75) # aangezien lineaire interpolatie de standaardmethode is voor open cv, hoeven we deze niet als een functie te implementeren. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # laten we de grootte van onze afbeelding verdubbelen img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # laten we het formaat wijzigen op basis van exacte afmetingen image_resize = cv2.resize (afbeelding, (200.300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Afbeeldingspiramides - Een andere manier om het formaat te wijzigen
Piramiderende afbeelding verwijst naar ofwel opschalen (afbeeldingen vergroten) of verkleinen (afbeeldingen verkleinen).
Het is gewoon een andere manier om het formaat te wijzigen waarmee we afbeeldingen eenvoudig en snel kunnen schalen door de hoogte en breedte van de nieuwe afbeelding met de helft te verkleinen.
Dit is handig bij het maken van objectdetectoren die de afbeeldingen schalen telkens wanneer naar een object wordt gezocht.
import cv2 afbeelding = cv2.imread ('input.jpg') kleiner = cv2.pyrDown (afbeelding) groter = cv2.pyrUp (kleiner) cv2.imshow ('origineel', afbeelding) cv2.waitKey (0) cv2.imshow ('kleiner', kleiner) cv2.waitKey (0) cv2.imshow ('groter', groter) cv2.waitKey (0) cv2.destroyAllWindows ()
In een grotere afbeelding zult u opmerken dat het nog steeds dezelfde grootte heeft als de originele afbeelding, maar weinig wazig is omdat het direct wordt omgezet van een kleinere afbeelding naar een grotere afbeelding. Maar als we het interpoleren, wordt de beeldkwaliteit verbeterd ten opzichte van de vorige omdat interpolatie de pixels schat terwijl de spaties worden opgevuld wanneer het beeld wordt vergroot.
Nu dezelfde code draaien maar met kubieke interpolatie geeft een betere kwaliteit van een grote afbeelding. Onderstaande afbeeldingen tonen de vergelijking tussen originele afbeelding, opgeschaalde versie van afbeelding, kleinere afbeelding en kubieke geïnterpoleerde versie van kleinere afbeelding.
import cv2 afbeelding = cv2.imread ('input.jpg') kleiner = cv2.pyrDown (afbeelding) groter = cv2.pyrUp (kleiner) cv2.imshow ('origineel', afbeelding) cv2.waitKey (0) cv2.imshow ('kleiner', kleiner) cv2.waitKey (0) cv2.imshow ('groter', groter) cv2.waitKey (0) # verhoging van de kwaliteit van geconverteerde grotere afbeelding van kleinere afbeelding met behulp van kubieke interpolatie img_double = cv2.resize (kleiner, Geen, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
OPMERKING: Als u meerdere kleine kopieën wilt maken van afbeeldingen die steeds kleiner worden of meerdere grote kopieën van afbeeldingen die continu in omvang toenemen, dan kunnen we gebruiken voor loops of while loops die binnen de pyrDown- of pyrUp- functie blijven.
6. Bijsnijden - Het gewenste beeldgebied uitsnijden
Afbeeldingen bijsnijden verwijst naar het extraheren van een beeldsegment.
OpenCV heeft direct geen bijsnijdfunctie, maar het kan eenvoudig worden gedaan door numpy met behulp van de onderstaande code
Cropped = afbeelding
We plaatsen de afbeeldingsarray en gebruiken indexeringstools of -methode in numpy, we definiëren de startrij tot de eindrij en de startkolom tot de eindkolom gescheiden door een komma die de rechthoek extraheert die we willen bijsnijden om de afbeelding te krijgen.
import cv2 import numpy als np image = cv2.imread ('input.jpg') hoogte, breedte = image.shape # laten we de beginpixelcoördinaten (linksboven van bijsnijdrechthoek) start_row, start_col = int (hoogte *.25), int (breedte *.25) # laten we de eindpixelcoördinaten krijgen (rechtsonder) end_row, end_col = int (hoogte *.75), int (breedte *.75) # gebruik gewoon indexering om de rechthoek uit te snijden die we willen cropped = afbeelding cv2.imshow ("originele afbeelding", afbeelding) cv2.waitKey (0) cv2.imshow ("bijgesneden afbeelding", bijgesneden) cv2.waitKey (0) cv2.destroyAllWindows ()
Merk op dat u pixelwaarden rechtstreeks kunt gebruiken in plaats van start_col of start_row , deze worden alleen gegeven om de gebruiker gemakkelijk te kunnen identificeren.
7. Rekenkundige bewerkingen voor het lichter en donkerder maken van afbeeldingen
Rekenkundige bewerkingen in OpenCV zijn in feite het toevoegen of aftrekken van matrixen aan de afbeelding, het toevoegen of aftrekken van matrixen heeft effect op het verhogen of verlagen van de helderheid.
Dus om matrixen toe te voegen of af te trekken, moeten we ze maken en numpy heeft een functie genaamd np.ones die matrixen geeft met dezelfde grootte als 1 van onze afbeelding.
import cv2 import numpy als np image = cv2.imread ('input.jpg') #creëer een matrix van iemands, vermenigvuldig deze dan met een schaalverdeling van 100 ' # np.ones geeft een matrix met dezelfde dimensie als onze afbeelding met alle de waarden zijn in dit geval 100 M = np.ones (image.shape, dtype = "uint8") * 100 #we gebruiken dit om deze matrix M aan onze afbeelding toe te voegen # let op de toename in helderheid toegevoegd = cv2.add (afbeelding, M) cv2.imshow ("Toegevoegd", toegevoegd) cv2.waitKey (0) #zoals wij kunnen ook aftrekken #noteer de afname in helderheid afgetrokken = cv2.subtract (afbeelding, M) cv2.imshow ("afgetrokken", afgetrokken) cv2.waitKey (0) cv2.destroyAllWindows ()
Dit is hoe OpenCV kan worden gebruikt om veel verschillende beeldbewerkingen op beeld toe te passen. We zullen in de volgende tutorial doorgaan met andere functies voor beeldmanipulatie.