- 1. Bildtransformationer - Affine och Non-Affine Transformation
- 2. Bildöversättningar - Flytta bilden uppåt, nedåt, vänster och höger
- 3. Rotation of image - Spinning the image
- 4. Skalning, storleksändring och interpolering
- 5. Bildpyramider - Ett annat sätt att ändra storlek på
- 6. Beskärning - Klipp ut den bildregion du vill ha
- 7. Aritmetiska operationer för ljusare och mörkare bilder
I föregående handledning har vi lärt oss om OpenCV och gjort en del grundläggande bildbehandling med den som gråskalning, färgmättnad, histogram, färgrymder, RGB-komponent etc. Som sagt i föregående handledning är OpenCV Open Source Commuter Vision Library som har C ++, Python och Java-gränssnitt och stöder Windows, Linux, Mac OS, iOS och Android. Så det kan enkelt installeras i Raspberry Pi med Python och Linux-miljö. Och Raspberry Pi med OpenCV och ansluten kamera kan användas för att skapa många realtidsbildbearbetningsapplikationer som ansiktsavkänning, ansiktslås, objektspårning, bilnummerplåtsdetektering, hemskyddssystem etc.
I den här handledningen ska vi se hur vi ska manipulera bilden med OpenCV. Här lär vi oss att tillämpa följande funktion på en bild med OpenCV:
- Bildtransformationer - Affine och Non-Affine Transformation
- Bildöversättningar - Flytta bilden uppåt, nedåt, vänster och höger
- Rotation of image - Snurra bilden
- Skalning, storleksändring och interpolering
- Bildpyramider - Ett annat sätt att ändra storlek på
- Beskärning - Klipp ut den bildregion du vill ha
- Aritmetiska operationer för ljusare och mörkare bilder
1. Bildtransformationer - Affine och Non-Affine Transformation
Transformationer är geometriska snedvridningar som antagits på en bild, snedvridningar betyder här inte misstag utan en korrigeringstyp för att korrigera de perspektivfrågor som uppstår från den punkt där bilden togs. Det finns två typer av bildtransformationer - Affine och Non-Affine
Affinetransformationer är av tre typer skalning, rotation och översättning, det viktiga i affinetransformationer är att linjer är parallella före och efter bildtransformationer.
Icke-affinetransformationer eller projektiva transformationer bevarar inte parallellitet, längd eller vinkel, men det bevarar dock kollineariteten och incidensen, kollineariteten betyder att de två punkterna ligger på samma raka linje.
Icke-affinetransformationer är mycket vanliga i datorsyn och genereras från olika kameravinklar. Icke-affina eller projektiva transformationer kallas också homografi.
2. Bildöversättningar - Flytta bilden uppåt, nedåt, vänster och höger
Bildöversättning flyttar bilden uppåt, nedåt, åt vänster och höger och till och med diagonalt om vi implementerar x- och y-översättningen samtidigt.
Nu för att utföra bildöversättningar använder vi opencvs warpAffine-funktion, cv2.warpAffine används för att implementera dessa översättningar men för det behöver vi en översättningsmatris.
Översättningsmatris, T = 1 0 Tx
0 1 ty
T X, T y är de riktningar i vilka bilden skiftas.
Där T X är förskjuten längs X-axeln (Horisontell)
T Y är förskjuten längs Y-axeln (vertikal)
# detta är en affin transformation som helt enkelt förskjuter positionen för en bild # vi använder cv2.warpAffine för att implementera dessa transformationer. importera cv2 importera numpy som np image = cv2.imread ('input.jpg') # lagra höjd och bredd för bildhöjd, bredd = image.shape print (image.shape) quater_height, quater_width = höjd / 4, bredd / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (bild, T, (bredd, höjd)) tryck (T) cv2.imshow ('original_bild', bild) cv2.waitKey (0) cv2.imshow (' Översättning ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Konsolutgång - (183, 275) - höjd och bredd
- T-matris
]
3. Rotation of image - Spinning the image
Rotation av bilden roterar en bild runt en punkt eller punkten i mitten av bilden, precis som den roterande punkten fungerar som en svängning.
Som i översättning har vi T-matris, troligen i rotation har vi M-matris
Rotationsmatris, M-matris = Cosθ -Sinθ
Sinθ Cosθ
Där θ är rotationsvinkeln, mätt moturs.
Det finns också en sak att notera att OpenCV låter dig sälja och rotera bild samtidigt med funktionen cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, rotationsvinkel, skala)
Vi använder fortfarande opencvs warpAffine-funktion för att få rotation av bilden men istället för översättningsmatris som i tidigare fall här använder vi rotationsmatrisen.
importera cv2 importera numpy som np image = cv2.imread ('input.jpg') höjd, bredd = bild.form # dela höjd och bredd med 2 för att rotera bilden runt dess centrum rotation_matrix = cv2.getRotationMatrix2D ((bredd / 2, höjd / 2), 90,1) roterad_bild = cv2.warpAffine (bild, rotation_matris, (bredd, höjd)) cv2.imshow ('originalbild', bild) cv2.waitKey (0) cv2.imshow ('roterad bild ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Nu roteras bilden 90 grader, den beskärs på grund av dukstorleken, eftersom dukstorleken förblir densamma men på grund av rotation passar bildstorleken inte in i dukstorleken. Det kan justeras genom att sätta skalningsfaktorn till negativ, men det tillåter en svart bakgrund bakom bilden.
Så du kan ställa in höjd och bredd på bilden genom att förutse den eller gissa den eller det finns en annan metod för att rotera bilden genom att transponera den, men den skulle rotera bilden med multiplarna 90 grader moturs.
4. Skalning, storleksändring och interpolering
Skalning och storleksändring är affina transformationer, att ändra storlek på bilden har vi gjort ganska länge och vi har också hanterat interpolering, som när du ändrar storlek på bilden till större storlek där vi expanderar pixlarna, det finns några luckor i pixlar och det är där interpolering kommer in.
Det kan inträffa när du ökar bildstorleken från mindre till större eller minskar bildstorleken från större till mindre.
Tekniskt sett är interpolering en metod för att konstruera nya datapunkter (pixlar) inom en diskret uppsättning kända datapunkter.
Det finns olika typer av interpoleringsmetoder i OpenCV som
cv2.INTER_AREA - bra för krympning eller nedprovtagning
cv2.INTER_NEAREST - snabbast
cv2.LINEAR - bra för zoomning eller upp sampling (standard)
cv2.CUBIC - bättre
cv2.INTER_LANCZOS4 - bäst
# resizing är väldigt enkelt med funktionen cv2.resize, dess argument är # cv2.resize (image, dsize (output image size), x_scale, y_scale, interpolation) import cv2 import numpy som np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', bild) cv2.waitKey (0) # låt oss göra bilden 3/4 till den ursprungliga bildstorleken, dvs skalas ner till 75% image_scaled = cv2.resize (image, None, fx = 0,75, fy = 0,75) # eftersom linjär interpolering är standardmetod för öppen cv behöver vi inte implementera den som en funktion. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # låt oss dubbla storleken på vår bild img_double = cv2.resize (bild, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # låt oss ändra storlek på exakta dimensioner image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_ex image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Bildpyramider - Ett annat sätt att ändra storlek på
Pyramideringsbild avser antingen uppskalning (förstorar bilder) eller nedskalning (krympande bilder).
Det är helt enkelt ett annat sätt att ändra storlek på som gör att vi enkelt och snabbt kan skala bilder, vilket minskar höjden och bredden på den nya bilden med hälften.
Detta är användbart när du gör objektdetektorer som skalar bilderna varje gång det letar efter ett objekt.
importera cv2- bild = cv2.imread ('input.jpg') mindre = cv2.pyrDown (bild) större = cv2.pyrUp (mindre) cv2.imshow ('original', bild) cv2.waitKey (0) cv2.imshow ('mindre', mindre) cv2.waitKey (0) cv2.imshow ('större', större) cv2.waitKey (0) cv2.destroyAllWindows ()
I större bild kommer du att märka att den fortfarande är av samma storlek som originalbilden, att den är lite suddig eftersom den omvandlas från mindre bild till större bild direkt. Men om vi interpolerar det förbättras bildkvaliteten från och med den tidigare eftersom interpolering uppskattar pixlarna medan de fyller i mellanslag när bilden förstoras.
Kör nu samma kod men med kubisk interpolation ger en bättre bildkvalitet. Nedanstående bilder visar jämförelsen mellan originalbild, uppskalad version av bild, mindre bild och kubisk interpolerad version av mindre bild.
importera cv2- bild = cv2.imread ('input.jpg') mindre = cv2.pyrDown (bild) större = cv2.pyrUp (mindre) cv2.imshow ('original', bild) cv2.waitKey (0) cv2.imshow ('mindre', mindre) cv2.waitKey (0) cv2.imshow ('större', större) cv2.waitKey (0) # ökar kvaliteten på konverterad större bild från mindre bild med kubisk interpolering 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 ()
OBS: Om du vill skapa flera små kopior av bilder som blir mindre och mindre i storlek eller flera stora kopior av bilder som kontinuerligt växer i storlek, kan vi använda för loopar eller medan loopar håller sig i pyrDown- eller pyrUp- funktionen.
6. Beskärning - Klipp ut den bildregion du vill ha
Beskärning av bilder avser att extrahera ett bildsegment.
OpenCV har direkt ingen beskärningsfunktion men det kan enkelt göras genom att bedöva med hjälp av nedanstående kod
Beskuren = bild
Vi sätter bildmatrisen och använder indexeringsverktyg eller metod i dom, vi definierar startrad till slutrad och startar kolumn till slutkolumn åtskild av ett komma som extraherar den rektangel som vi vill beskära för att få bilden.
importera cv2 importera numpy som np image = cv2.imread ('input.jpg') höjd, bredd = image.shape # låt oss få startpixelkoordinaterna (längst upp till vänster i beskärningsrektangel) start_row, start_col = int (höjd *.25), int (bredd *.25) # låt oss få slutpixelkoordinater (nere till höger) end_row, end_col = int (höjd *.75), int (bredd *.75) # använd bara indexering för att beskära den rektangel som vi önskar beskäras = bild cv2.imshow ("originalbild", bild) cv2.waitKey (0) cv2.imshow ("beskuren bild", beskuren) cv2.waitKey (0) cv2.destroyAllWindows ()
Observera att du kan använda pixelvärden direkt istället för start_col eller start_row , de ges bara för att få enkel identifiering för användaren.
7. Aritmetiska operationer för ljusare och mörkare bilder
Aritmetiska operationer i OpenCV är i grund och botten att lägga till eller subtrahera matriser till bilden, att lägga till eller subtrahera matriser har effekt på att öka eller minska ljusstyrkan.
Så för att lägga till eller subtrahera matriser måste vi skapa dem och numpy har en funktion som kallas np.ones som ger matriser av 1 samma storlek som vår bild.
importera cv2 importera numpy som np image = cv2.imread ('input.jpg') # skapa en matris av en, multiplicera den sedan med en skalare på 100 ' # np.ones ger en matris med samma dimension som vår bild med alla de värden som är 100 i detta fall M = np.ones (image.shape, dtype = "uint8") * 100 #we använder denna för att lägga till denna matris M till vår image #notice ökningen i ljusstyrka added = cv2.add (bild, M) cv2.imshow ("Lagt till", lagt till) cv2.waitKey (0) # liksom vi kan också subtrahera # märker minskningen av ljusstyrka subtraherad = cv2.subtract (bild, M) cv2.imshow ("subtraherad", subtraherad) cv2.waitKey (0) cv2.destroyAllWindows ()
Så här kan OpenCV användas för att tillämpa många olika bildbehandlingsåtgärder på bilden. Vi fortsätter med andra bildmanipuleringsfunktioner i nästa handledning.