- Hva er bilder?
- Hvordan datamaskinen lagrer bilder
- Hvorfor det er vanskelig for en maskin å identifisere bilder
- Søknad og bruk av OpenCV
- Installere OpenCV med Python og Anaconda
- Åpne og lagre bilder i OpenCV
- Grå skaleringsbilde i OpenCV
- Fargerom
- Utforske individuelle komponenter i RGB-bilde
- Konverterer bilde til individuell RGB-komponent
- Histogram representasjon av bilde
- Tegne bilder og former ved hjelp av OpenCV
Kunst er en måte å se på, og de sier å se er å tro, men det motsatte er også sant, å tro er å se og det er veldig vanskelig å forestille seg å leve i denne verden uten visjonen - våre øyne, hvor fantastisk det er å være et spedbarn når øynene våre bare åpnes ser vi verden og begynte å gjenkjenne og se verden rundt oss, men etter hvert som tiden går, blir den samme fantastiske opplevelsen en dagligdagse opplevelse. Men når vi utvikler oss med teknologien, befinner vi oss i en kant hvor maskinene også kan se og forstå den. Foreløpig ser det ikke ut til å være en sci-fi hvis du bare låser opp telefonen med ansiktet ditt, men historien om utviklingen av maskinvisjonen er datert tilbake til mer enn 20 år.
Det første formelle trinnet på dette feltet ble tatt tilbake i 1999 i et Intel-initiativ, da all forskning pågår ble samarbeidet under OPEN CV (Open Source computer vision), opprinnelig skrevet i C ++, med sin første store utgivelse 1.0 i 2006 andre i 2009, tredje i 2015 og fjerde akkurat nå i 2018. Nå har OpenCV 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, sikkerhetssystem hjemme
Før du går inn i å lære bildebehandling ved hjelp av openCV, er det viktig å vite hva bilder er og hvordan mennesker og maskiner oppfatter disse bildene.
Hva er bilder?
Bilder er en todimensjonal fremstilling av det synlige lysspekteret. Og det synlige lysspekteret er bare en del av det elektromagnetiske spekteret som ligger der mellom infrarødt og ultrafiolett spektrum.
Hvordan dannes bilder: - når et lys reflekterer av et objekt på en film, en sensor eller på netthinnen.
Dette er hvordan øynene våre fungerer, ved å bruke en barriere for å blokkere lyspunktet som etterlater en liten åpning som lyset kan passere gjennom det, kalles som blenderåpning, og det danner et mye fokusert bilde og er en arbeidsmodell for et pin-hole kamera men det er et problem i et hull med kamera, at samme mengde lys kommer inn i blenderåpningen, noe som ikke kan være egnet for filmen eller bildet som dannes, og vi kan ikke få et fokusert bilde for å fokusere bildet vi trenger å flytte film frem og tilbake, men dette er problematisk i mange situasjoner.
Eller vi kan løse dette problemet ved å bruke linser, det lar oss kontrollere blenderåpningen, og i fotografering er den kjent som f Stop, generelt er verdien på f Stop bedre i fotografering.
Blenderåpning lar oss også komme inn i fin dybdeskarphet kalt Bokeh i fotografering, det gjør at vi kan ha en uskarp bakgrunn mens vi fokuserer på bildet.
Hvordan datamaskinen lagrer bilder
Du har kanskje hørt om forskjellige bildeformater som.png,.jpgG og osv. Alt dette er digital representasjon av vår analoge verden, datamaskiner gjør det ved å oversette bildet til digital kode for lagring og tolker deretter filen tilbake til et bilde for vise. Men i utgangspunktet bruker de en felles plattform for lagring av bildene, og det samme gjelder openCV.
OpenCV bruker RGB (rød, grønn og blå) fargerom som standard for sine bilder, der hver pikselkoordinat (x, y) inneholder 3 verdier som spenner for intensiteter i 8-biters form, dvs. (0-255, 2 8).
Å blande forskjellige intensiteter av hver farge gir oss hele spekteret. Derfor blir disse tre fargene i maling eller kunst sett på som primærfarger og alle andre som sekundære, fordi de fleste sekundærfarger kan dannes av primærfarger. Som for gult har vi følgende verdier: Rød - 255; Grønn - 255; Blå - 0.
Nå lagres bildene i flerdimensjonale matriser. I programmering er array en serie med samling av objekter. Og her har vi å gjøre med tre typer matriser 1D, 2D og 3D der 'D' står for dimensjonal.
Fargede bilder lagres i tredimensjonale matriser, hvor den tredje dimensjonen representerer RGB-farger (som vi vil se senere), og sammen danner de forskjellige intensiteter av piksler for et bilde, mens de svart-hvite bildene lagres i todimensjonale matriser og det er også to typer svart-hvitt-bilder gråtoner og binære bilder.
Gråskala bilder er dannet av gråtoner i et todimensjonalt utvalg, mens binære bilder er av piksler enten av svart eller hvitt.
Hvorfor det er vanskelig for en maskin å identifisere bilder
Datasyn er en utfordrende oppgave i seg selv, du kan selv forestille deg hvor vanskelig det er å gi en maskin en følelse av syn, anerkjennelse og identifikasjon. Følgende faktorer er der som gjør datasynet så vanskelig.
- Begrensninger for kamerasensor og linser
- Visningsvariasjoner
- Skifter belysning
- Skalering
- Okklusjoner
- Objektklassevariasjoner
- Tvetydige bilder / optiske illusjoner
Søknad og bruk av OpenCV
Til tross for vanskeligheter har Computer Vision mange suksesshistorier
- Robotnavigasjon - Selvkjørende biler
- Ansiktsgjenkjenning og anerkjennelse
- Søkemotors bildesøk
- Lisensskiltlesing
- Håndskriftgjenkjenning
- Snapchat og ansiktsfiltre
- Objektgjenkjenning
- Ball & Player Tracking i sport
- Og mange flere!
Installere OpenCV med Python og Anaconda
OpenCV er skrevet i C ++, men det er veldig vanskelig å implementere det med C ++, og derfor velger vi å implementere det med et høyt språk som python, og det er også flere fordeler med å implementere OpenCV med python, da Python er et av de enkleste språkene for nybegynnere også Det er ekstremt kraftig for datavitenskap og maskinlæringsapplikasjoner, og det lagrer også bilder i numme ordninger som lar oss gjøre noen veldig kraftige operasjoner ganske enkelt.
Grunnleggende programmering er nyttig med Exposure to High School Level Math, et webkamera, Python 2.7 eller 3.6 (Anaconda-pakke foretrekkes).
Trinn 1. Last ned og installer Anaconda Python-pakke
Gå til: https://www.anaconda.com/download og velg i henhold til maskinens vær, windows, Linux eller mac, og du kan velge for python 2.7 eller python 3.7-versjon for enten 64-biters eller 32-bitersystemer, men nå om dagen er det meste av systemet 64 bit.
Anaconda distribusjon av python kommer sammen med Spyder studio, jupyter notatbøker og anaconda prompt, noe som gjør python super vennlig å bruke. Vi bruker spyder studio for å gjøre eksemplene.
Valget mellom python 2.7 eller 3.7 er helt nøytralt, men for eksemplene bruker vi python 3.7 siden det er fremtiden til python og vil ta over python 2.7 fra 2020, også de fleste bibliotekene blir utviklet i python 3.7. fremtidens aspekt av python i tankene. Det gir også de forventede resultatene på grunnleggende matematiske operasjoner som (2/5 = 2,5), mens python 2.7 vil evaluere den til 2. Også utskrift blir behandlet som en funksjon i python 3.7 (utskrift ("hei")), så det gir praktisk til programmererne.
Trinn 2. Opprette en virtuell plattform med OpenCV
Vi skal installere OpenCV ved å lage en virtuell plattform for spyder ved å bruke Anaconda-ledeteksten og YML-filen lastet opp her.
Med YML-filene vil vi installere alle pakkene og bibliotekene som er nødvendige, men hvis du vil installere tilleggspakker, kan du enkelt installere dem gjennom anaconda-ledeteksten ved å kjøre kommandoen til den pakken.
Gå til Windows-søkeikonet og finn anaconda ledeterminal, du finner den inne i anaconda-mappen du nettopp har installert.
Da må du finne den nedlastede YML-filen din, og herfra har du to valg, enten å endre katalogen til terminalen din til stedet der YML-filen din lastes ned, eller enten kopiere YML-filen til katalogen der anaconda er installert mest tilfeller vil det være inne i C: \ drive, etter å ha kopiert YML-filen til den angitte plasseringen, KJØR følgende kommando på ledeteksten
conda env create –f virtual_platform_windows.yml
Siden systemet mitt kjører på Windows, tilsvarer YML-filen og kommandoen Windows, men du kan endre i henhold til systemet ditt ved å erstatte Windows med henholdsvis Linux eller Mac.
Merk: - Hvis pakkeutvinning gir feil, installer først pytorch og numpy og kjør deretter kommandoen ovenfor.
Finn nå anaconda-navigatøren, og det vil være en rullegardinmeny med “Applications on ___” og derfra velger du virtuelt miljø, og deretter må du starte Spyder studio.
Og det er det, du er klar til å komme i gang!
Åpne og lagre bilder i OpenCV
Her forklarer vi noen grunnleggende kommandoer og terminologi for å bruke Python i OpenCV. Vi vil lære om tre grunnleggende funksjoner i OpenCV imread, imshow og imwrite.
#kommentarer i python er gitt med # symbol
Importer opencv i python etter kommando
importere cv2
Last inn et bilde ved hjelp av 'imread' og spesifiser banen til bildet
image = cv2.imread ('input.jpg')
Nå lastes det bildet og lagres i python som en variabel vi kalte bildet
Nå for å vise bildevariabelen bruker vi 'imshow', og den første parameteren for imshow-funksjonen er tittelen som vises i bildevinduet, og den må legges inn i ('') for å representere navnet som en streng
cv2.imshow ('hei verden', bilde)
Ventetasten lar oss legge inn informasjon når bildevinduet er åpent, ved å la det være tomt, det venter bare på hvilken som helst tast som skal trykkes før vi fortsetter, ved å plassere tall (unntatt 0), kan vi spesifisere en forsinkelse for hvor lenge du holder vinduet åpent i millisekunder her).
cv2.waitKey ()
'destroyAllWindows' lukker alle åpne vinduer, hvis du ikke plasserer dette, vil programmet ditt henge.
cv2.destroyAllWindows ()
, for dette vil vi bruke numpy, numpy er et bibliotek for pythonprogrammering for å legge til støtte til store flerdimensjonale matriser og matriser.
import cv2 #importing numpy import numpy as np image = cv2.imread ('input.jpg') cv2.imshow ('hallo_world', image) #shape- funksjon er veldig nyttig når vi ser på dimensjoner til en matrise, den returnerer en tuple som gir en dimensjon av et bildeutskrift (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
konsollutgang - (183, 275, 3), De to dimensjonene på bildet er 183 piksler i høyden og 275 piksler i bredden og 3 betyr at det er tre andre komponenter (R, G, B) som gjør dette bildet (det viser at de fargede bildene lagres i tredimensjonale matriser).
print ('Bildens høyde:', (image.form, 'piksler')) print ('Bildets bredde:', (image.form, 'piksler'))
konsollutgang - Høyde på bilde: (183, 'piksler')
Bredde på bildet: (275, 'piksler')
Lagrer det redigerte bildet i OpenCV
Vi bruker 'imwrite' for å spesifisere filnavnet og bildet som skal lagres.
cv2.imwrite ('output.jpg', image) cv2.imwrite ('output.png', image)
Første argument er navnet på filen vi vil lagre, {å lese eller lagre filen vi bruker ('') for å indikere den som en streng}, og det andre argumentet er filnavnet.
OpenCV lar deg lagre bildet i forskjellige formater.
Grå skaleringsbilde i OpenCV
Gråskalering er prosessen der et bilde konverteres fra full farge til gråtoner (svart og hvitt)
I opencv gråtoner mange funksjoner bildene før de behandles. Dette gjøres fordi det forenkler bildet, fungerer nesten som støyreduksjon og øker behandlingstiden ettersom det er mindre informasjon i bildet (ettersom gråtonebilder lagres i todimensjonale matriser).
importer cv2 # last inn input image image = cv2.imread ('input.jpg') cv2.imshow ('original', image) cv2.waitKey () # vi bruker cvtcolor, for å konvertere til gråtoner grå_image = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('gråtoner', grå_bilde) cv2.waitKey () cv2.destroyALLWindows ()
Enklere måte å konvertere bilde til gråtoner er bare å legge til argumentet 0 i imread- funksjonen til side for bildenavnet
import cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('gråtoner', grå_bilde) cv2.waitKey () cv2.destroyAllWindows ()
importer cv2 import numpy som np image = cv2.imread ('input.jpg') print (image.shape) cv2.imshow ('original', image) cv2.waitKey () grey_image = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('gråtoner', grå_bilde) utskrift (grå_bilde.form) cv2.waitKey () cv2.destroyALLWindows ()
Konsollutgang: - (183, 275, 3) - for farget bilde
(183, 275) - for gråtonebilde
Derfor viser det tydelig at de fargede bildene er representert av tredimensjonale matriser, mens gråskalabildene er av todimensjonale matriser.
Fargerom
Fargerom er måten bildene lagres på. RGB, HSV, CMYK er forskjellige fargerom, dette er bare enkle måter å representere farge på.
RGB - Rød, grønn og blå.
HSV - Fargetone, metning og verdi.
Og CMYK brukes ofte i blekkskrivere.
RGB eller BGR fargerom
OpenCVs standardfargerom er RGB. RGB er en additiv fargemodell som genererer farger ved å kombinere blå, grønne og røde farger med forskjellige intensiteter / lysstyrke. I OpenCV bruker vi 8 bit fargedybder.
- Rød (0-255)
- Blå (0-255)
- Grønn (0-255)
Imidlertid lagrer OpenCV faktisk farger i BGR-format.
Morsom fakta: - Vi bruker BGR-ordre i datamaskiner på grunn av hvordan usignerte 32-biters heltall lagres i minnet, det ender fortsatt med å bli lagret som RGB. Heltallet som representerer en farge, for eksempel: - 0X00BBGGRR vil bli lagret som 0XRRGGBB.
HSV fargeromHSV (Hue, Saturation & value / Brightness) er et fargerom som prøver å representere farger menneskene oppfatter det. Den lagrer fargeinformasjon i en sylindrisk fremstilling av RGB-fargepunkter.
Fargetone - fargeverdi (0-179)
Metning - Levende farger (0-255)
Verdi - Lysstyrke eller intensitet (0-255)
HSV-fargeromformat er nyttig i fargesegmentering. I RGB er det ikke lett å filtrere spesifikk farge, men HSV gjør det mye enklere å angi fargeområder for å filtrere spesifikk farge slik vi oppfatter dem.
Fargetone representerer fargen i HSV, fargetoneverdien varierer fra 0 - 180 og ikke 360, slik at den ikke fullfører hele sirkelen, og så blir den kartlagt annerledes enn standarden.
Fargeområdet filtre
- Rød - (165-15)
- Grønn - (45-75)
- Blå - (90-120)
Som vi vet bildene som lagres i RGB (rød, grønn og blå) farge plass og slik at OpenCV viser oss det samme, men det første du må huske på opencv's RGB format er at det faktisk er BGR, og vi kan vite det ved å se på bildeform.
importer cv2 import numpy som np image = cv2.imread ('input.jpg') # B, G, R-verdi for den første 0,0 piksel B, G, R = bildeutskrift (B, G, R) utskrift (bilde.shape) # nå hvis vi bruker dette på gråtonebilde grå_img = cv2.cvtColor (bilde, cv2.COLOR_BGR2GRAY) utskrift (grå_img.shape) #grå_bildepikselverdi for 10,50 piksler (grå_img)
Konsollutgang: utskrift (B, G, R) - 6 11 10
print (image.shape) - (183, 275, 3)
trykk (grå_form. form) - (183, 275)
utskrift (grå_img) - 69
Nå er det bare to dimensjoner i et gråskalabilde, siden vi husker at fargebildet er lagret i tre dimensjoner, den tredje dimensjonen er (R, G, B) mens det i gråtoner bare er to dimensjoner til stede, siden (R, G, B) er fraværende og for en bestemt pikselposisjon får vi bare en enkelt verdi mens vi i farget bilde har tre verdier.
Et annet nyttig fargerom er HSV
importer cv2 image = cv2.imread ('input.jpg') hsv_image = cv2.cvtColor (image, cv2.COLOR_BGR2HSV) cv2.imshow ('HSV image', hsv_image) cv2.imshow ('Hue channel', hsv_image) cv2. imshow ('metningskanal', hsv_image) cv2.imshow ('verdikanal', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()
Etter å ha kjørt koden kan du se de fire bildene, hvorav tre er av de enkelte kanalene og ett er kombinert HSV-bilde.
Hue-kanalbildet er ganske mørkt fordi verdien bare varierer fra 0 til 180.
Vær også oppmerksom på at imshow- funksjonen prøver å vise deg RGB- eller BGR-bildet, men HSV-konvertering overlapper det.
Verdikanalen vil også være lik gråtonen på bildet på grunn av lysstyrken.
Utforske individuelle komponenter i RGB-bilde
importer cv2 image = cv2.imread ('input.jpg') # opencv's split-funksjon deler bildetinti hver fargeindeks B, G, R = cv2.split (image) cv2.imshow ("Red", R) cv2.imshow ("Grønn", G) cv2.imshow ("Blå", B) # lage originalbildet ved å slå sammen de enkelte fargekomponentene slått sammen = cv2.merge () cv2.imshow ("slått sammen", slått sammen) # forsterkning av den blå fargen slått sammen = cv2.merge () cv2.imshow ("flettet med blå forsterkning", flettet) # representerer formen på individuelle fargekomponenter. # utgangen vil bare være to dimensjoner som vil være høyde og bredde, siden tredje element av RGB-komponent er individuelt representert print (B.shape) print (R.form) trykk (G. form) cv2.waitKey (0) cv2.destroyAllWindows ()
Konsollutgang : # dimensjoner av bilde fra formfunksjon
(183, 275)
(183, 275)
(183, 275)
Konverterer bilde til individuell RGB-komponent
I koden nedenfor har vi laget en matrise med nuller med dimensjonene på bildet HxB, null returnerer en matrise fylt med nuller, men med samme dimensjoner.
Formfunksjon er veldig nyttig når vi ser på dimensjonen til et bilde, og her har vi gjort skiver av den formfunksjonen. Så form vil gripe alt opp til utpekte punkter, dvs. opp til andre utpekte punkter som vil være høyde og bredde på bildet som tredje representerer RGB-komponent av bildet, og vi trenger ikke det her.
importer cv2 import numpy som np image = cv2.imread ('input.jpg') B, G, R = cv2.split (image) nuller = np.zeros (image.shape, dtype = "uint8") cv2.imshow ("RØD", cv2.merge ()) cv2.imshow ("Grønn", cv2.merge ()) cv2.imshow ("Blå", cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()
Histogram representasjon av bilde
Histogramrepresentasjon av bilde er metoden for å visualisere bildekomponentene.
Følgende kode lar deg analysere bildet gjennom fargehistogrammet for dets kombinerte og individuelle fargekomponenter.
import cv2 import numpy as np #we need to import matplotlib to create histogram plots import matplotlib.pyplot as plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (,, None,,) # we plot a histogram, ravel () flater vårt bildearray plt.hist (image.ravel (), 256,) plt.show () #viewing separate colour channel color = ('b', 'g', 'r') # vi vet skille fargen og plotte hver i histogram for i, kol i oppregne (farge): histogram2 = cv2.calcHist (,, Ingen,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()
La oss forstå calcHist- funksjonen med hver av dens individuelle parametere
cv2.calcHist (bilder, kanaler, maske, størrelse , rekkevidde)
Bilder: det er kildebildet av typen uint 8 eller float 32. Det skal gis i firkantede parenteser, dvs. "", som også indikerer det andre nivået array siden et bilde for opencv er data i en array form.
Kanaler: den er også gitt i parentes. Det er indeksen til kanalen som vi beregner histogram for, for eksempel hvis inngang er et gråtonebilde, er verdien, for fargebilder du kan sende, eller for å beregne histogram for henholdsvis blå, grønn og rød kanal.
Maske: maskebilde. for å finne histogrammet for det fulle bildet, blir det gitt som "ingen". men hvis du vil finne histogrammet for en bestemt region i bildet, må du opprette et maskebilde for det og gi det som en maske.
Histsize: Dette representerer vårt BIN-antall. Nødvendig å bli gitt i firkantede parenteser for full skala vi passerer.
Områder: Dette er vårt sortiment, er det normalt
Tegne bilder og former ved hjelp av OpenCV
Nedenfor er noen eksempler på tegning av linjer, rektangel, polygon, sirkel osv. I OpenCV.
import cv2 import numpy as np #creating a black square image = np.zeros ((512,512,3), np.uint8) # vi kan også lage dette i svart-hvitt, men det ville ikke være noen endringer image_bw = np.zeros ((512,512), np.uint8) cv2.imshow ("svart rektangel (farge)", bilde) cv2.imshow ("svart rektangel (svart-hvitt)", image_bw)
Linje
# skape en linje over svart firkant # cv2.line (bilde, startkoordinater, sluttkoordinater, farge, tykkelse) # tegne en diagonal linje med tykkelse 5 piksler image = np.zeros ((512,512,3), np.uint8) cv2.line (image, (0,0), (511,511), (255,127,0), 5) cv2.imshow ("blue line", image)
Rektangel
# skape et rektangel over en svart firkant # cv2.rectangle (bilde, startkoordinater, sluttkoordinater, farge, tykkelse) # tegne et rektangel med tykkelse 5 piksler image = np.zeros ((512,512,3), np.uint8) cv2.rektangel (bilde, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("rektangel", bilde)
# skape en sirkel over en svart firkant # cv2.circle (image, center, radius, color, fill) image = np.zeros ((512,512,3), np.uint8) cv2.circle (image, (100,100), (50), (255,127,0), - 1) cv2.imshow ("sirkel", bilde)
#creating a polygon image = np.zeros ((512,512,3), np.uint8) #lets definerer fire poeng pts = np.array (,,,], np.int32) #lets omformer nå poengene våre i form som kreves av polylines pts = pts.reshape ((- 1,1,2)) cv2.polylines (image,, True, (0,255,255), 3) cv2.imshow ("polygon", image)
#putting text using opencv # cv2.putText (image, 'text to display', bootom left start point, font, font size, color, thickness) image = np.zeros ((512,512,3), np.uint8) cv2. putText (image, "hallo verden", (75,290), cv2.FONT_HERSHEY_COMPLEX, 2, (100,170,0), 3) cv2.imshow ("hallo verden", bilde) cv2.waitKey (0) cv2.destroyAllWindows ()
Computer Vision og OpenCV er veldig store emner å dekke, men denne guiden vil være et godt utgangspunkt for å lære OpenCV og bildebehandling.