- Hvad er billeder?
- Hvordan computer gemmer billeder
- Hvorfor det er vanskeligt for en maskine at identificere billeder
- Anvendelse og anvendelse af OpenCV
- Installation af OpenCV med Python og Anaconda
- Åbning og lagring af billeder i OpenCV
- Gråt skaleringsbillede i OpenCV
- Farveområder
- Udforskning af individuelle komponenter i RGB-billede
- Konvertering af billede til individuel RGB-komponent
- Histogram repræsentation af billedet
- Tegning af billeder og former ved hjælp af OpenCV
Kunst er en måde at se på, og de siger, at se er at tro, men det modsatte er også sandt, at tro er at se, og det er virkelig svært at forestille sig at leve i denne verden uden gaveens vision - vores øjne, hvor vidunderligt det er at være et spædbarn når vores øjne bare åbner, ser vi verden og begyndte at genkende og se verden omkring os, men når tiden går, bliver den samme vidunderlige oplevelse en dagligdags oplevelse. Men efterhånden som vi udvikler os med teknologien, befinder vi os i en ramme, hvor maskinerne også kan se og forstå den. I øjeblikket ser det ikke ud til at være en sci-fi, hvis du bare låser din telefon op med dit ansigt, men historien om udviklingen af maskinens vision er dateret langt tilbage til mere end 20 år.
Det oprindelige formelle trin på dette felt blev taget tilbage i 1999 i et Intel-initiativ, da al forskning, der foregik, blev samarbejdet under OPEN CV (Open Source computervision), oprindeligt skrevet i C ++, med sin første store udgivelse 1.0 i 2006 anden i 2009, tredje i 2015 og fjerde lige nu i 2018. Nu har OpenCV 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 skabe mange billedbehandlingsapplikationer i realtid som ansigtsgenkendelse, ansigtslås, genstandssporing, registrering af bilens nummerplade, sikkerhed i hjemmet osv.
Før du går ind i at lære billedbehandling ved hjælp af openCV, er det vigtigt at vide, hvad billeder er, og hvordan mennesker og maskiner opfatter disse billeder.
Hvad er billeder?
Billeder er en todimensional repræsentation af det synlige lysspektrum. Og det synlige lysspektrum er bare en del af det elektromagnetiske spektrum der ligger mellem infrarødt og ultraviolet spektrum.
Hvordan dannes billeder: - når et lys reflekterer et objekt på en film, en sensor eller på nethinden.
Sådan fungerer vores øjne ved hjælp af en barriere til at blokere det mest lyspunkt, der efterlader en lille åbning, gennem hvilken lys kan passere det, kaldes som blænde, og det danner et meget fokuseret billede og er en arbejdsmodel til et pin-hul-kamera, men der er et problem i et pin hulkamera, at den samme mængde lys kommer ind i blændeåbningen, hvilket ikke kunne være egnet til den film eller det dannede billede, vi kan heller ikke få et fokuseret billede for at fokusere det billede, vi har brug for at flytte film frem og tilbage, men dette er problematisk i mange situationer.
Eller vi kan løse dette problem ved hjælp af linser, det giver os mulighed for at kontrollere blænderstørrelsen, og i fotografering er det kendt som f Stop, generelt er værdien af f Stop bedre ved fotografering.
Blændestørrelse giver os også mulighed for at komme ind i en fin dybdeskarphed kaldet Bokeh i fotografering, det giver os mulighed for at have en sløret baggrund, mens vi fokuserer på billedet.
Hvordan computer gemmer billeder
Du har muligvis hørt om forskellige billedformater som.png,.jpgG osv. Alt dette er digital repræsentation af vores analoge verden, computere gør det ved at oversætte billedet til digital kode til opbevaring og fortolke derefter filen tilbage til et billede til Skærm. Men grundlæggende bruger de en fælles platform til lagring af billederne, og det samme gælder for openCV.
OpenCV bruger som standard RGB (rød, grøn og blå) farveplads til sine billeder, hvor hver pixelkoordinat (x, y) indeholder 3 værdier, der spænder for intensiteter i 8-bit form, dvs. (0-255, 2 8).
Blanding af forskellige intensiteter af hver farve giver os det fulde spektrum. Derfor betragtes disse tre farver i maleri eller kunst som primære farver og alle andre som sekundære, fordi de fleste sekundære farver kan dannes af primære farver. Som for gul har vi følgende værdier: Rød - 255; Grøn - 255; Blå - 0.
Nu gemmes billederne i flerdimensionelle arrays. I programmering er array en række samlinger af objekter. Og her beskæftiger vi os med tre typer arrays 1D, 2D og 3D, hvor 'D' står for dimensionel.
Farvede billeder gemmes i tredimensionelle arrays, hvor den tredje dimension repræsenterer RGB-farverne (som vi vil se senere), og sammen danner de forskellige pixelintensiteter for et billede, mens de sort / hvide billeder er gemt i todimensionale arrays og der er også to typer sort / hvide billeder Gråtone og binære billeder.
Gråtonebilleder er dannet af gråtonerne i et todimensionelt array, mens de binære billeder er af pixels enten af sort eller hvid.
Hvorfor det er vanskeligt for en maskine at identificere billeder
Computersyn er en udfordrende opgave i sig selv, du kan selv forestille dig, hvor svært det er at give en maskine en følelse af vision, anerkendelse og identifikation. Følgende faktorer er der, der gør computersynet så hårdt.
- Begrænsninger for kamerasensor og linser
- Visningsvariationer
- Skiftende belysning
- Skalering
- Okklusioner
- Objektklasse variationer
- Tvetydige billeder / optiske illusioner
Anvendelse og anvendelse af OpenCV
På trods af vanskelighederne har Computer Vision mange succeshistorier
- Robotnavigation - Selvkørende biler
- Ansigtsgenkendelse og -genkendelse
- Søgemaskine billedsøgning
- Nummerpladelæsning
- Anerkendelse af håndskrift
- Snapchat & ansigtsfiltre
- Objektgenkendelse
- Ball & Player Tracking i sport
- Og mange flere!
Installation af OpenCV med Python og Anaconda
OpenCV er skrevet i C ++, men det er meget svært at implementere det med C ++, og derfor vælger vi at implementere det med et sprog på højt niveau som python, og der er også yderligere fordele ved at implementere OpenCV med python, da Python er et af de nemmeste sprog også for begyndere Det er ekstremt kraftfuldt til datalogi og maskinindlæringsapplikationer, og det gemmer også billeder i følelsesløse arrays, hvilket giver os mulighed for at udføre nogle meget kraftige operationer ganske let.
Grundlæggende programmering er nyttig med Exposure to High School Level Math, et webcam, Python 2.7 eller 3.6 (Anaconda-pakke foretrækkes).
Trin 1. Download og installer Anaconda Python-pakke
Gå til: https://www.anaconda.com/download, og vælg alt efter din maskins vejr, dets windows, Linux eller mac, og du kan vælge python 2.7 eller python 3.7-version til enten 64-bit-systemer eller 32-bit-systemer, men nu om dagen er det meste af systemet 64 bit.
Anaconda-distribution af python kommer sammen med Spyder-studie, jupyter-notesbøger og anaconda-prompt, hvilket gør python supervenligt at bruge. Vi bruger spyder studio til at lave eksemplerne.
Valget mellem python 2.7 eller 3.7 er helt neutralt, men for eksemplerne bruger vi python 3.7, da det er fremtiden for python og overtager python 2.7 fra 2020, og de fleste biblioteker udvikles også i python 3.7 og holder det fremtidige aspekt af python i tankerne. Det giver også de forventede resultater på grundlæggende matematiske operationer som (2/5 = 2,5), mens python 2.7 vil evaluere det til 2. Også print behandles som en funktion i python 3.7 (print ("hej")), så det giver hands-on til programmørerne.
Trin 2. Oprettelse af en virtuel platform med OpenCV
Vi skal installere OpenCV ved at oprette en virtuel platform til spyder ved hjælp af Anaconda-prompten og YML-filen uploadet her.
Med YML-filerne installerer vi alle de pakker og biblioteker, der er nødvendige, men hvis du vil installere yderligere pakker, kan du nemt installere via anaconda-prompt ved at køre kommandoen for den pakke.
Gå til dit Windows-søgeikon og find anaconda prompt terminal, du kan finde den inde i din anaconda-mappe, som du lige har installeret.
Derefter skal du finde din downloadede YML-fil, og herfra har du to valg, enten at ændre telefonbiblioteket til din terminal til det sted, hvor din YML-fil downloades, eller enten kopiere din YML-fil til det bibliotek, hvor din anaconda er installeret mest tilfælde ville det være inde i C: \ drive, efter at du har kopieret din YML-fil til den angivne placering Kør følgende kommando på din prompt
conda env oprette –f virtual_platform_windows.yml
Da mit system kører på windows, yML-filen og kommandoen svarer til windows, men du kan ændre i henhold til dit system ved at erstatte windows med linux eller mac som henholdsvis.
Bemærk: - Hvis pakkeudtræk giver fejl, skal du først installere pytorch og numpy og derefter køre ovenstående kommando.
Find nu anaconda-navigatoren, og der vil være en rullemenu med "Applikationer på ___" og derfra skal du vælge et virtuelt miljø og derefter derfra skal du starte Spyder studio.
Og det er det, du er klar til at komme i gang!
Åbning og lagring af billeder i OpenCV
Her forklarer vi nogle grundlæggende kommandoer og terminologi til at bruge Python i OpenCV. Vi lærer om tre grundlæggende funktioner i OpenCV imread, imshow og imwrite.
#kommentarer i python er givet med symbolet #
Importer opencv i python efter kommando
importer cv2
Indlæs et billede ved hjælp af 'imread', der angiver stien til billedet
image = cv2.imread ('input.jpg')
Nu er det billede indlæst og gemt i python som en variabel, vi navngav som billede
Nu for at få vist vores billedvariabel bruger vi 'imshow', og den første parameter til imshow-funktionen er titlen vist i billedvinduet, og den skal indtastes i ('') for at repræsentere navnet som en streng
cv2.imshow ('hej verden', billede)
ventetasten giver os mulighed for at indtaste information, når billedvinduet er åbent, ved at lade det være tomt, det venter bare på, at der trykkes på en vilkårlig tast, inden vi fortsætter, ved at placere tal (undtagen 0), kan vi specificere en forsinkelse for hvor længe du holder vinduet åbent (tid i millisekunder her).
cv2.waitKey ()
'destroyAllWindows' lukker alle de åbne vinduer, hvis dette ikke placeres, får dit program hængende.
cv2.destroyAllWindows ()
, til dette bruger vi numpy, numpy er et bibliotek til pythonprogrammering til tilføjelse af understøttelse til store flerdimensionelle arrays og matricer.
import cv2 #importing numpy import numpy som np image = cv2.imread ('input.jpg') cv2.imshow ('hello_world', image) #shape- funktion er meget nyttig, når vi ser på en matrixs dimensioner , det returnerer en tuple, der giver en dimension af et billedudskrivning (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
konsoludgang - (183, 275, 3), Billedets to dimensioner er 183 pixels i højden og 275 pixels i bredden og 3 betyder, at der er tre andre komponenter (R, G, B), der gør dette billede (det viser at de farvede billeder er gemt i tredimensionelle arrays).
print ('Billedets højde:', (image.form, 'pixels')) print ('Billedets bredde:', (billede.form, 'pixels'))
konsoludgang - billedets højde: (183, 'pixels')
Billedets bredde: (275, 'pixels')
Gemme det redigerede billede i OpenCV
Vi bruger 'imwrite' til at specificere filnavnet og det billede, der skal gemmes.
cv2.imwrite ('output.jpg', image) cv2.imwrite ('output.png', image)
Første argument er navnet på den fil, vi vil gemme, {at læse eller gemme den fil, vi bruger ('') til at angive den som en streng}, og det andet argument er filnavnet.
OpenCV giver dig mulighed for at gemme billedet i forskellige formater.
Gråt skaleringsbillede i OpenCV
Gråskalering er den proces, hvor et billede konverteres fra en fuld farve til gråtoner (sort og hvid)
I opencv gråtoner mange funktioner billederne, før de behandles. Dette gøres, fordi det forenkler billedet og fungerer næsten som støjreduktion og øger behandlingstiden, da der er mindre information i billedet (da gråtonebilleder gemmes i todimensionale arrays).
importer cv2 # indlæs vores inputbillede = cv2.imread ('input.jpg') cv2.imshow ('original', image) cv2.waitKey () # vi bruger cvtcolor til at konvertere til gråtoner grå_billede = cv2.cvtColor (billede, cv2.COLOR_BGR2GRAY) cv2.imshow ('gråtoner', grå_billede) cv2.waitKey () cv2.destroyALLWindows ()
Enklere måde at konvertere billede til gråtoner er bare at tilføje argumentet 0 i imread- funktionen til side til billednavnet
import cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('grayscale', grey_image) cv2.waitKey () cv2.destroyAllWindows ()
import 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å_billede) print (grå_billede.form) cv2.waitKey () cv2.destroyALLWindows ()
Konsoludgang: - (183, 275, 3) - til farvet billede
(183, 275) - til et gråtonebillede
Derfor viser det tydeligt, at de farvede billeder er repræsenteret af tredimensionelle arrays, mens gråskalabillederne er todimensionale arrays.
Farveområder
Farverum er den måde, billederne er lagret på. RGB, HSV, CMYK er de forskellige farverum, det er bare enkle måder at repræsentere farve på.
RGB - Rød, grøn og blå.
HSV - Farvetone, mætning og værdi.
Og CMYK bruges ofte i inkjetprintere.
RGB- eller BGR-farverum
OpenCVs standardfarverum er RGB. RGB er en additiv farvemodel, der genererer farver ved at kombinere blå, grønne og røde farver med forskellige intensiteter / lysstyrke. I OpenCV bruger vi 8 bit farvedybder.
- Rød (0-255)
- Blå (0-255)
- Grøn (0-255)
Imidlertid gemmer OpenCV faktisk farve i BGR-format.
Sjov fakta: - Vi bruger BGR-ordre i computere på grund af, hvordan usignerede 32-bit heltal er gemt i hukommelsen, det ender stadig med at blive gemt som RGB. Heltallet, der repræsenterer en farve, fx: - 0X00BBGGRR, gemmes som 0XRRGGBB.
HSV-farverumHSV (Hue, Saturation & value / Brightness) er et farverum, der forsøger at repræsentere farver, som mennesker opfatter det. Den gemmer farveinformation i en cylindrisk gengivelse af RGB-farvepunkter.
Farvetone - farveværdi (0-179)
Mætning - Levende farve (0-255)
Værdi - Lysstyrke eller intensitet (0-255)
HSV-farvepladsformat er nyttigt i farvesegmentering. I RGB er det ikke let at filtrere specifik farve, men HSV gør det meget nemmere at indstille farveområder for at filtrere specifik farve, som vi opfatter dem.
Farvetone repræsenterer farven i HSV, nuanceværdien varierer fra 0 - 180 og ikke 360, så den ikke fuldfører den fulde cirkel, og den kortlægges således anderledes end standarden.
Farveområde filtre
- Rød - (165-15)
- Grøn - (45-75)
- Blå - (90-120)
Som vi kender, gemmes billederne i RGB (rød, grøn og blå) farveplads, og så viser OpenCV os det samme, men den første ting at huske på opencv's RGB-format er, at det faktisk er BGR, og vi kan vide det ved at se på billedform.
import cv2 import numpy som np image = cv2.imread ('input.jpg') # B, G, R værdi for den første 0,0 pixel B, G, R = billedudskrivning (B, G, R) udskrivning (billede.form) # nu, hvis vi anvender dette på gråtonebillede grå_img = cv2.cvtColor (billede, cv2.COLOR_BGR2GRAY) print (grå_img.shape) #grå_billede pixelværdi til 10,50 pixeludskrivning (grå_img)
Konsoludgang: print (B, G, R) - 6 11 10
print (image.shape) - (183, 275, 3)
print (grå_img.form) - (183, 275)
print (grå_img) - 69
Nu er der kun to dimensioner i et gråskalabillede, da vi husker, at farvebilledet er gemt i tre dimensioner, hvor den tredje dimension er (R, G, B), mens der kun er to dimensioner i gråtoner til stede, da (R, G, B) er fraværende, og for en bestemt pixelposition får vi kun en enkelt værdi, mens vi i farvet billede har tre værdier.
Et andet nyttigt farverum er HSV
import 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 ('saturation channel', hsv_image) cv2.imshow ('value channel', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()
Efter kørsel af koden kan du se de fire billeder, hvoraf tre er af de enkelte kanaler, og et kombineret HSV-billede.
Nuancekanalbilledet er ret mørkt, fordi dets værdi kun varierer fra 0 til 180.
Bemærk også, at imshow- funktionen forsøger at vise dig RGB- eller BGR-billedet, men HSV-konvertering overlapper det.
Værdikanalen svarer også til billedets gråtoner på grund af dens lysstyrke.
Udforskning af individuelle komponenter i RGB-billede
import cv2 image = cv2.imread ('input.jpg') # opencv's split-funktion opdeler imageinti hvert farveindeks B, G, R = cv2.split (image) cv2.imshow ("Rød", R) cv2.imshow ("Grøn", G) cv2.imshow ("Blå", B) #fremstilling af det originale billede ved at flette de enkelte farvekomponenter flettet = cv2.merge () cv2.imshow ("flettet", flettet) # forstærkning af den blå flettede farve = cv2.merge () cv2.imshow ("fusioneret med blå forstærke", flettet) # repræsenterer formen på individuelle farvekomponenter. # output ville kun være todimension, som ville være højde og bredde, da tredje element af RGB-komponent er individuelt repræsenteret print (B.shape) print (R.form) print (G. form) cv2.waitKey (0) cv2.destroyAllWindows ()
Konsoloutput : #dimensioner af billede fra formfunktion
(183, 275)
(183, 275)
(183, 275)
Konvertering af billede til individuel RGB-komponent
I nedenstående kode har vi oprettet en matrix med nuller med dimensionerne på billedet HxB, nul returnerer et array fyldt med nuller, men med samme dimensioner.
Formfunktion er meget nyttig, når vi ser på dimensionen af et billede, og her har vi udskåret den formfunktion. Så form ville gribe alt op til udpegede punkter, dvs. op til andet udpegede punkter, der ville være højde og bredde på billedet, da det tredje repræsenterer RGB-komponenten i billedet, og vi har ikke brug for det her.
import 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øn", cv2.merge ()) cv2.imshow ("Blå", cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()
Histogram repræsentation af billedet
Histogramrepræsentation af billede er metoden til at visualisere komponenterne i billeder.
Den følgende kode giver dig mulighed for at analysere billedet gennem farvehistogrammet for dets kombinerede og individuelle farvekomponenter.
importer cv2 import numpy som np # vi skal importere matplotlib for at oprette histogram-plots import matplotlib.pyplot som plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (,, Ingen,,) # vi plot a histogram, ravel () glatter vores billedopstilling plt.hist (image.ravel (), 256,) plt.show () #visning af separate farvekanaler color = ('b', 'g', 'r') # vi kender adskil farven og plot hver i histogram for i, col i enumerate (color): histogram2 = cv2.calcHist (,, None,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()
Lad os forstå calcHist- funktionen med hver af dens individuelle parametre
cv2.calcHist (billeder, kanaler, maske, størrelse , intervaller)
Billeder: det er kildebilledet af typen uint 8 eller float 32. Det skal gives i firkantede parenteser, dvs. "", som også angiver dets andet niveau array, da et billede til opencv er data i en array-form.
Kanaler: det er også angivet i firkantede parenteser. Det er kanalindekset, som vi beregner histogram for, for eksempel hvis input er gråtonebillede, er dets værdi, for farvebilleder, du kan passere, eller for at beregne histogram for henholdsvis blå, grøn og rød kanal.
Maske: maskebillede. for at finde histogrammet for det fulde billede angives det som "ingen". men hvis du vil finde histogrammet for et bestemt billedområde, skal du oprette et maskebillede til det og give det som en maske.
Histsize: Dette repræsenterer vores BIN-antal. Nødvendigt at blive givet i firkantede parenteser for fuld skala vi passerer.
Områder: Dette er normalt vores sortiment
Tegning af billeder og former ved hjælp af OpenCV
Nedenfor er få eksempler på tegning af linjer, rektangel, polygon, cirkel osv. I OpenCV.
import cv2 import numpy som np #creating a black square image = np.zeros ((512,512,3), np.uint8) # vi kan også oprette dette i sort og hvid, men der ville ikke være nogen ændringer image_bw = np.zeros ((512,512), np.uint8) cv2.imshow ("sort rektangel (farve)", billede) cv2.imshow ("sort rektangel (sort / hvid)", image_bw)
Linie
# Opret en linje over sort firkant # cv2.line (billede, startkoordinater, slutkoordinater, farve, tykkelse) #tegning af en diagonal linie med tykkelse 5 pixels image = np.zeros ((512,512,3), np.uint8) cv2.line (billede, (0,0), (511,511), (255,127,0), 5) cv2.imshow ("blå linje", billede)
Rektangel
# Opret et rektangel over en sort firkant # cv2.rectangle (billede, startkoordinater, slutkoordinater, farve, tykkelse) #tegning af et rektangel med tykkelse 5 pixels image = np.zeros ((512,512,3), np.uint8) cv2.rektangel (billede, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("rektangel", billede)
# skabe en cirkel over en sort firkant # cv2.circle (billede, center, radius, farve, fyld) image = np. nuller ((512,512,3), np.uint8) cv2.circle (image, (100,100), (50), (255,127,0), - 1) cv2.imshow ("cirkel", billede)
#creating a polygon image = np.zeros ((512,512,3), np.uint8) #lets definerer fire punkter pts = np.array (,,,], np.int32) #lets omformer nu vores punkter i form krævet af polylinier pts = pts.reshape ((- 1,1,2)) cv2.polylines (billedet,, True, (0.255.255), 3) cv2.imshow ("polygon", billede)
# sætte tekst ved hjælp af opencv # cv2.putText (billede, 'tekst til visning', startpunkt venstre startpunkt, skrifttype, skriftstørrelse, farve, tykkelse) image = np.zeros ((512,512,3), np.uint8) cv2. putText (billede, "hej verden", (75.290), cv2.FONT_HERSHEY_COMPLEX, 2, (100.170,0), 3) cv2.imshow ("hej verden", billede) cv2.waitKey (0) cv2.destroyAllWindows ()
Computer Vision og OpenCV er meget store emner at dække, men denne guide ville være et godt udgangspunkt for at lære OpenCV og billedbehandling.