- 1. Image Transformations - Affine og Non-Affine Transformation
- 2. Image Translations - Flytter bilde opp, ned, venstre og høyre
- 3. Rotasjon av bildet - Spinning av bildet
- 4. Skalering, endring av størrelse og interpolering
- 5. Image Pyramids - En annen måte å endre størrelse på
- 6. Beskjæring - Kutting av det bildeområdet du vil ha
- 7. Aritmetiske operasjoner for lysere og mørkere bilder
I den forrige opplæringen har vi lært om OpenCV og gjort noen grunnleggende bildebehandling ved å bruke den som grå skalering, fargemetning, histogram, fargerom, RGB-komponent osv. Som fortalt i forrige opplæring er OpenCV Open Source Commuter Vision Library som har C ++, Python og Java-grensesnitt og støtter Windows, Linux, Mac OS, iOS og Android. Så det kan enkelt installeres i Raspberry Pi med Python og Linux-miljø. Og Raspberry Pi med OpenCV og tilkoblet kamera kan brukes til å lage mange sanntids bildebehandlingsapplikasjoner som ansiktsgjenkjenning, ansiktslås, gjenstandssporing, registreringsnummer for bilnummer, hjemmesikkerhetssystem etc.
I denne opplæringen skal vi se hvordan vi skal manipulere bildet ved hjelp av OpenCV. Her lærer vi å bruke følgende funksjon på et bilde ved hjelp av OpenCV:
- Image Transformations - Affine and Non-Affine Transformation
- Image Translations - Flytter bilde opp, ned, venstre og høyre
- Rotasjon av bildet - Spinning av bildet
- Skalering, endring av størrelse og interpolering
- Image Pyramids - En annen måte å endre størrelse på
- Beskjæring - Klipp ut det bildeområdet du vil ha
- Aritmetiske operasjoner for lysere og mørkere bilder
1. Image Transformations - Affine og Non-Affine Transformation
Transformasjoner er geometriske forvrengninger pålagt et bilde, forvrengninger betyr absolutt ikke her feil, men en korreksjonstype for å korrigere perspektivproblemene som oppstår fra det punktet hvor bildet ble tatt. Det er to typer bildetransformasjoner - Affine og Non-Affine
Affinetransformasjoner er av tre typer skalering, rotasjon og oversettelse, det viktigste i affinetransformasjoner er at linjene er parallelle før og etter bildetransformasjoner.
Ikke-affine transformasjoner eller prosjektive transformasjoner bevarer ikke parallellitet, lengde eller vinkel, men det bevarer imidlertid kollineariteten og forekomsten, kollineariteten betyr at de to punktene ligger på samme rette linje.
Ikke-affine transformasjoner er veldig vanlige i datasyn og genereres fra forskjellige kameravinkler. Ikke-affine eller prosjektive transformasjoner kalles også homografi.
2. Image Translations - Flytter bilde opp, ned, venstre og høyre
Bildeoversettelse beveger bildet opp, ned, venstre og høyre og til og med diagonalt hvis vi implementerer x- og y-oversettelsen samtidig.
Nå for å utføre bildeoversettelser bruker vi opencvs warpAffine-funksjon, cv2.warpAffine brukes til å implementere disse oversettelsene, men til det trenger vi en oversettelsesmatrise.
Oversettelsesmatrise, T = 1 0 Tx
0 1 ty
T X, T y er retningene som bildet forskyver seg i.
Der T X forskyves langs X-aksen (Horisontal)
T Y er forskyvet langs Y-aksen (vertikal)
# dette er en affin transformasjon som bare skifter posisjonen til et bilde # vi bruker cv2.warpAffine for å implementere disse transformasjonene. importer cv2 import numpy som np image = cv2.imread ('input.jpg') # lagre høyden og bredden på bildehøyden, bredde = image.shape print (image.shape) quater_height, quater_width = høyde / 4, bredde / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (image, T, (width, height)) print (T) cv2.imshow ('original_image', image) cv2.waitKey (0) cv2.imshow (' Oversettelse ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Konsollutgang - (183, 275) - høyde og bredde
- T-matrise
]
3. Rotasjon av bildet - Spinning av bildet
Rotasjon av bildet roterer et bilde rundt et punkt eller punktet i midten av bildet, akkurat som rotasjonspunktet fungerer som en sving.
Som i oversettelse har vi T-matrise, sannsynligvis i rotasjon har vi M-matrise
Rotasjonsmatrise, M-matrise = Cosθ -Sinθ
Sinθ Cosθ
Der θ er rotasjonsvinkelen, målt mot urviseren.
Det er også en ting å merke seg at OpenCV lar deg selge og rotere bildet samtidig ved hjelp av funksjonen, cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, rotasjonsvinkel, skala)
Vi bruker fortsatt opencvs warpAffine-funksjon for å få rotasjonen av bildet, men i stedet for oversettelsesmatrise som i forrige tilfelle her bruker vi rotasjonsmatrisen.
importer cv2 import numpy som np image = cv2.imread ('input.jpg') høyde, bredde = image.form # divider høyden og bredden med 2 for å rotere bildet om det midtre rotation_matrix = cv2.getRotationMatrix2D ((bredde / 2, høyde / 2), 90,1) rotated_image = cv2.warpAffine (image, rotation_matrix, (width, height)) cv2.imshow ('original image', image) cv2.waitKey (0) cv2.imshow ('rotated image ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Nå roteres bildet 90 grader, det blir beskåret på grunn av lerretstørrelsen, siden lerretstørrelsen forblir den samme, men på grunn av rotasjon passer ikke bildestørrelsen inn i lerretstørrelsen. Det kan justeres ved å sette skaleringsfaktoren til negativ, men det gir en svart bakgrunn bak bildet.
Så du kan stille inn høyden og bredden på bildet ved å forutse det eller gjette det, eller det er en annen metode for å rotere bildet ved å transponere det, men det vil rotere bildet multipliser på 90 grader mot klokken.
4. Skalering, endring av størrelse og interpolering
Skalering og endring av størrelse er affine transformasjoner, å endre størrelse på bildet er det vi har gjort ganske lenge, og vi har også jobbet med interpolering, som når du endrer størrelsen på bildet til større størrelse der vi utvider pikslene, er det noen hull i piksler, og det er her interpolering kommer inn.
Det kan oppstå når du øker bildestørrelsen fra mindre til større eller reduserer bildestørrelsen fra større til mindre.
Teknisk sett er interpolering en metode for å konstruere nye datapunkter (piksler), innenfor et diskret sett med kjente datapunkter.
Det er forskjellige typer interpolasjonsmetoder i OpenCV som
cv2.INTER_AREA - bra for krymping eller nedprøving
cv2.INTER_NEAREST - raskest
cv2.LINEAR - bra for zooming eller opp sampling (standard)
cv2.CUBIC - bedre
cv2.INTER_LANCZOS4 - best
# resizing er veldig enkelt ved hjelp av funksjonen cv2.resize, dens argumenter er # cv2.resize (image, dsize (output image size), x_scale, y_scale, interpolation) import cv2 import numpy as np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', bilde) cv2.waitKey (0) # la oss gjøre bildet 3/4 til den opprinnelige bildestørrelsen, dvs. skaleres ned til 75% image_scaled = cv2.resize (image, None, fx = 0,75, fy = 0,75) # siden lineær interpolasjon er standardmetode for åpen cv, trenger vi ikke implementere den som en funksjon. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # la oss doble størrelsen på bildet vårt img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # la oss endre størrelsen på eksakte dimensjoner image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Image Pyramids - En annen måte å endre størrelse på
Pyramideringsbilde refererer til enten oppskalering (forstørrelse av bilder) eller nedskalering (krympende bilder).
Det er rett og slett en annen måte å endre størrelse på, som lar oss enkelt og raskt skalere bilder og redusere høyden og bredden på det nye bildet med halvparten.
Dette er nyttig når du lager objektdetektorer som skalerer bildene hver gang det ser etter et objekt.
importer cv2 image = cv2.imread ('input.jpg') mindre = cv2.pyrDown (image) større = cv2.pyrUp (mindre) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('mindre', mindre) cv2.waitKey (0) cv2.imshow ('større', større) cv2.waitKey (0) cv2.destroyAllWindows ()
I større bilde vil du legge merke til at det fortsatt er av samme størrelse som originalbildet, det er litt uskarpt fordi det blir konvertert fra mindre bilde til større bilde direkte. Men hvis vi interpolerer den, blir bildekvaliteten forbedret i forhold til den forrige fordi interpolering estimerer pikslene mens du fyller ut mellomrommene når bildet forstørres.
Kjører nå den samme koden, men med kubisk interpolasjon, gir bedre kvalitet på stort bilde. Bildene nedenfor viser sammenligningen mellom originalbilde, oppskalert versjon av bilde, mindre bilde og kubisk interpolert versjon av mindre bilde.
import cv2 image = cv2.imread ('input.jpg') smaller = cv2.pyrDown (image) larger = cv2.pyrUp (smaller) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('mindre', mindre) cv2.waitKey (0) cv2.imshow ('større', større) cv2.waitKey (0) # øker kvaliteten på konvertert større bilde fra mindre bilde ved hjelp av kubisk interpolering img_double = cv2.resize (mindre, Ingen, fx = 2, fy = 2, interpolering = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
MERKNAD: Hvis du vil lage flere små kopier av bilder som blir mindre og mindre i størrelse eller flere store kopier av bilder som kontinuerlig vokser i størrelse, kan vi bruke dem til løkker eller mens du holder dem inne i pyrDown- eller pyrUp- funksjonen.
6. Beskjæring - Kutting av det bildeområdet du vil ha
Beskjæring av bilder refererer til å trekke ut et segment av bildet.
OpenCV har direkte ikke beskjæringsfunksjon, men det kan enkelt gjøres ved å numpe ved hjelp av koden nedenfor
Beskåret = bilde
Vi setter bildearrayen og bruker indekseringsverktøy eller metode i nummen, vi definerer start rad til slutt rad og start kolonne til slutt kolonne atskilt med et komma som trekker ut rektangelet vi vil beskjære for å få bildet.
importer cv2 import numpy som np image = cv2.imread ('input.jpg') høyde, bredde = image.shape # la oss få startpikselkoordinatene (øverst til venstre for beskjæringsrektangel) start_row, start_col = int (høyde *.25), int (bredde *.25) # la oss få endepikselkoordinater (nederst til høyre) end_row, end_col = int (høyde *.75), int (bredde *.75) # bruk bare indeksering for å beskjære rektangelet vi ønsker beskåret = bilde cv2.imshow ("original image", image) cv2.waitKey (0) cv2.imshow ("beskåret bilde", beskåret) cv2.waitKey (0) cv2.destroyAllWindows ()
Merk at du kan bruke pikselverdier direkte i stedet for start_col eller start_row , de er bare gitt for å få den enkle identifikasjonen for brukeren.
7. Aritmetiske operasjoner for lysere og mørkere bilder
Aritmetiske operasjoner i OpenCV er i utgangspunktet å legge til eller trekke fra matriser til bildet, å legge til eller trekke fra matriser har effekt på å øke eller redusere lysstyrken.
Så for å legge til eller trekke fra matriser, må vi opprette dem og numme har en funksjon som kalles np.ones som gir matriser av samme størrelse som bildet vårt.
importer cv2 import numpy som np image = cv2.imread ('input.jpg') # opprett en matrise av ens, og multipliser den deretter med en skalering på 100 ' # np.ones gir en matrise med samme dimensjon som av vårt bilde med alle verdiene er 100 i dette tilfellet M = np.ones (image.shape, dtype = "uint8") * 100 # vi bruker dette for å legge til denne matrisen M til vårt bilde # legg merke til økningen i lysstyrke lagt til = cv2.add (image, M) cv2.imshow ("Lagt til", lagt til) cv2.waitKey (0) # på samme måte kan vi også trekke fra # merker reduksjonen i lysstyrke trukket = cv2.subtract (image, M) cv2.imshow ("subtrahert", trukket) cv2.waitKey (0) cv2.destroyAllWindows ()
Slik kan OpenCV brukes til å bruke mange forskjellige bildebehandlingsoperasjoner på bildet. Vi vil fortsette med andre bildemanipuleringsfunksjoner i neste opplæring.