- Vad är bilder?
- Hur datorn lagrar bilder
- Varför det är svårt för en maskin att identifiera bilder
- Tillämpning och användning av OpenCV
- Installerar OpenCV med Python och Anaconda
- Öppna och spara bilder i OpenCV
- Grå skalningsbild i OpenCV
- Färgutrymmen
- Utforska enskilda komponenter i RGB-bilden
- Konverterar bild till enskild RGB-komponent
- Histogramrepresentation av bilden
- Rita bilder och former med OpenCV
Konst är ett sätt att se, och de säger att se är att tro, men det motsatta är också sant, att tro är att se och det är verkligen svårt att föreställa sig att leva i den här världen utan visionens gåva - våra ögon, hur underbart det är att vara ett spädbarn när våra ögon bara öppnar ser vi världen och började känna igen och se världen omkring oss men när tiden går förbi blir samma underbara upplevelse en vardaglig upplevelse. Men när vi går framåt med tekniken befinner vi oss på en gräns där maskinerna också kan se och förstå den. För närvarande verkar det inte vara en sci-fi om du bara låser upp din telefon med ditt ansikte, men historien om utvecklingen av maskinvisionen dateras långt tillbaka till mer än 20 år.
Det första formella steget på detta område togs tillbaka 1999 i ett Intel-initiativ, då all forskning som pågår samarbetades under OPEN CV (Open Source-datorsyn), ursprungligen skriven i C ++, med sin första stora version 1.0 2006 andra 2009, tredje 2015 och fjärde just nu 2018. Nu har OpenCV 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.
Innan du går in för att lära dig bildbehandling med openCV är det viktigt att veta vad bilder är och hur människor och maskiner uppfattar dessa bilder.
Vad är bilder?
Bilder är en tvådimensionell representation av det synliga ljusspektrumet. Och det synliga ljusspektret är bara en del av det elektromagnetiska spektrumet som ligger där mellan infrarött och ultraviolett spektrum.
Hur bildas bilder: - när ett ljus reflekterar från ett objekt på en film, en sensor eller på näthinnan.
Detta är hur våra ögon fungerar, med hjälp av en barriär för att blockera ljuspunkten som lämnar en liten öppning genom vilken ljuset kan passera det kallas som bländare, och det bildar en mycket fokuserad bild och är en fungerande modell för en hålkamera, men det finns ett problem i en hålkamera, att samma mängd ljus kommer in i bländaren, vilket inte kan vara lämpligt för den film eller den bildade bilden, vi kan inte heller få en fokuserad bild för att fokusera bilden vi måste flytta film fram och tillbaka, men det är problematiskt i många situationer.
Eller så kan vi åtgärda detta problem genom att använda linser, det gör att vi kan kontrollera bländarstorleken, och vid fotografering är det känt som f Stop, i allmänhet är värdet på f Stop bättre i fotografering.
Bländarstorlek låter oss också komma in i ett fint skärpedjup som kallas Bokeh i fotografering, det gör att vi kan ha en suddig bakgrund medan vi fokuserar på bilden.
Hur datorn lagrar bilder
Du kanske har hört talas om olika bildformat som.png,.jpgG och etc. allt detta är digital representation av vår analoga värld, datorer gör det genom att översätta bilden till digital kod för lagring och sedan tolka filen tillbaka till en bild för visa. Men i grund och botten använder de en gemensam plattform för att lagra bilderna, och detsamma gäller för openCV.
OpenCV använder RGB (rött, grönt och blått) färgutrymme som standard för sina bilder, där varje pixelkoordinat (x, y) innehåller 3 värden som sträcker sig för intensiteter i 8-bitarsform, dvs. (0-255, 2 8).
Att blanda olika intensiteter för varje färg ger oss hela spektrumet, därför betraktas dessa tre färger i målning eller konst som primära färger och alla andra som sekundära, eftersom de flesta sekundära färger kan bildas av primära färger. Liksom för gult har vi följande värden: Röd - 255; Grön - 255; Blå - 0.
Nu lagras bilderna i flerdimensionella matriser. I programmering är array en serie med samling objekt. Och här hanterar vi tre typer av matriser 1D, 2D och 3D där 'D' står för dimensionell.
Färgade bilder lagras i tredimensionella matriser, där de tredje dimensionerna representerar RGB-färgerna (som vi kommer att se senare), och tillsammans bildar de olika intensiteter av pixlar för en bild, medan de svartvita bilderna lagras i tvådimensionella matriser och det finns också två typer av svartvita bilder gråskala och binära bilder.
Gråskalebilder bildas från gråtonerna i en tvådimensionell matris, medan de binära bilderna är av pixlar antingen i svart eller vitt.
Varför det är svårt för en maskin att identifiera bilder
Datorsyn är en utmanande uppgift i sig, du kan själv föreställa dig hur svårt det är att ge en maskin en känsla av syn, igenkänning och identifiering. Följande faktorer finns där som gör datasynen så svår.
- Kamerasensor och linsbegränsningar
- Synpunkter variationer
- Byt belysning
- Skalning
- Ocklusioner
- Objektklassvariationer
- Tvetydiga bilder / optiska illusioner
Tillämpning och användning av OpenCV
Trots svårigheten har Computer Vision många framgångshistorier
- Robotnavigering - Självkörande bilar
- Ansiktsavkänning och erkännande
- Sökmotor bildsökning
- Registrering av registreringsskylt
- Handskriftsigenkänning
- Snapchat och ansiktsfilter
- Objektigenkänning
- Boll- och spelarspårning i sport
- Och många fler!
Installerar OpenCV med Python och Anaconda
OpenCV är skrivet i C ++, men det är väldigt mycket svårt att implementera det med C ++ och därför väljer vi att implementera det med ett högt språk som python, och det finns också ytterligare fördelar med att implementera OpenCV med python eftersom Python är ett av de enklaste språken. för nybörjare också Det är extremt kraftfullt för datavetenskap och maskininlärningsapplikationer och det lagrar också bilder i domna matriser vilket gör att vi kan göra några mycket kraftfulla operationer ganska enkelt.
Grundläggande programmering är användbar med Exposure to High School Level Math, en webbkamera, Python 2.7 eller 3.6 (Anaconda-paket föredras).
Steg 1. Ladda ner och installera Anaconda Python-paketet
Gå till: https://www.anaconda.com/download och välj enligt din maskin väder dess windows, Linux eller mac och du kan välja för python 2.7 eller python 3.7 version för antingen 64-bitars system eller 32-bitars system, men nu dagarna är det mesta av systemet 64 bitar.
Anaconda-distribution av python kommer tillsammans med Spyder-studio, jupyter-anteckningsböcker och anaconda-prompt, vilket gör python supervänligt att använda. Vi skulle använda spyder studio för att göra exemplen.
Valet mellan python 2.7 eller 3.7 är helt neutralt, men för exemplen skulle vi använda python 3.7 eftersom det är framtiden för python och kommer att ta över python 2.7 från 2020, även de flesta biblioteken utvecklas i python 3.7 och håller den framtida aspekten av python i åtanke. Det ger också de förväntade resultaten på grundläggande matematiska operationer som (2/5 = 2,5), medan python 2.7 skulle utvärdera det till 2. Även utskrift behandlas som en funktion i python 3.7 (utskrift ("hej")), så det ger hands till programmörerna.
Steg 2. Skapa en virtuell plattform med OpenCV
Vi kommer att installera OpenCV genom att skapa en virtuell plattform för spyder med Anaconda-prompten och YML-filen som laddas upp här.
Med YML-filerna installerar vi alla paket och bibliotek som skulle behövas, men om du vill installera ytterligare paket kan du enkelt installera via anaconda-prompten genom att köra kommandot för det paketet.
Gå till din Windows-sökikon och hitta anaconda snabbterminal, du hittar den i din anaconda-mapp som du just har installerat.
Då måste du hitta din nedladdade YML-fil, och härifrån har du två val att antingen ändra katalogen på din terminal till den plats där din YML-fil laddas ner eller antingen kopiera din YML-fil till den katalog där din anaconda är installerad mest. fall skulle det vara inne i C: \ drive, efter att du har kopierat din YML-fil till den angivna platsen KÖR följande kommando på din fråga
conda env skapa –f virtual_platform_windows.yml
Eftersom mitt system körs på windows, YML-filen och kommandot motsvarar windows, men du kan ändra enligt ditt system genom att ersätta windows med linux eller mac som respektive.
Obs: - Om paketutdragningen ger fel, installera först pytorch och numpy och kör sedan kommandot ovan.
Hitta nu anacondanavigatorn och det skulle finnas en rullgardinsmeny med "Applikationer på ___" och därifrån väljer du en virtuell miljö och därifrån måste du starta Spyder studio.
Och det är det, du är redo att komma igång!
Öppna och spara bilder i OpenCV
Här förklarar vi några grundläggande kommandon och terminologi för att använda Python i OpenCV. Vi lär oss om tre grundläggande funktioner i OpenCV imread, imshow och imwrite.
#kommentarer i python ges med symbolen #
Importera opencv i python med kommando
importera cv2
Ladda en bild med 'imread' och ange sökvägen till bilden
image = cv2.imread ('input.jpg')
Nu laddas den bilden och lagras i python som en variabel som vi namngav som bild
För att visa vår bildvariabel använder vi 'imshow' och den första parametern för imshow-funktionen är titeln som visas i bildfönstret, och den måste anges i ('') för att representera namnet som en sträng
cv2.imshow ('hej värld', bild)
vänsterknapp tillåter oss att mata in information när bildfönstret är öppet, genom att lämna det tomt väntar det bara på valfri tangent innan vi fortsätter, genom att placera nummer (förutom 0), kan vi ange en fördröjning för hur länge du håller fönstret öppet (tid i millisekunder här).
cv2.waitKey ()
'destroyAllWindows' stänger alla öppna fönster, om du inte placerar detta kommer ditt program att hängas.
cv2.destroyAllWindows ()
, för detta kommer vi att använda numpy, numpy är ett bibliotek för pythonprogrammering för att lägga till stöd till stora flerdimensionella matriser och matriser.
importera cv2 #importing numpy import numpy som np image = cv2.imread ('input.jpg') cv2.imshow ('hello_world', image) #shape- funktionen är väldigt användbar när vi tittar på dimensioner för en array, det returnerar en tuple som ger en dimension av en bildutskrift (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
konsolutgång - (183, 275, 3), Bildens två dimensioner är 183 pixlar i höjd och 275 pixlar i bredd och 3 betyder att det finns tre andra komponenter (R, G, B) som gör denna bild (den visar att de färgade bilderna lagras i tredimensionella matriser).
skriv ut ('Bildens höjd:', (bild.form, 'pixlar')) tryck ('Bildens bredd:', (bild.form, 'pixlar'))
konsolutgång - Bildhöjd: (183, 'pixlar')
Bildens bredd: (275, 'pixlar')
Sparar den redigerade bilden i OpenCV
Vi använder 'imwrite' för att specificera filnamnet och bilden som ska sparas.
cv2.imwrite ('output.jpg', image) cv2.imwrite ('output.png', image)
Första argumentet är namnet på filen vi vill spara, {att läsa eller spara filen vi använder ('') för att ange den som en sträng} och andra argumentet är filnamnet.
OpenCV låter dig spara bilden i olika format.
Grå skalningsbild i OpenCV
Gråskalning är den process genom vilken en bild omvandlas från en fullfärg till gråtoner (svartvitt)
I opencv gråskalar många funktioner bilderna innan de bearbetas. Detta görs eftersom det förenklar bilden, fungerar nästan som en brusreducering och ökar bearbetningstiden eftersom det finns mindre information i bilden (eftersom gråskalebilder lagras i tvådimensionella matriser).
importera cv2 # ladda vår inmatningsbild = cv2.imread ('input.jpg') cv2.imshow ('original', bild) cv2.waitKey () # vi använder cvtcolor, för att konvertera till gråskala grå_bild = cv2.cvtColor (bild, cv2.COLOR_BGR2GRAY) cv2.imshow ('gråskala', grå_bild) cv2.waitKey () cv2.destroyALLWindows ()
Ett enklare sätt att konvertera bilden till gråskala är att bara lägga till argumentet 0 i imread- funktionen åt sidan till bildnamnet
importera cv2 grå_bild = cv2.imread ('input.jpg', 0) cv2.imshow ('gråskala', grå_bild) 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åskala', grå_bild) tryck (grå_bild.form) cv2.waitKey () cv2.destroyALLWindows ()
Konsolutgång: - (183, 275, 3) - för färgad bild
(183, 275) - för gråskalebild
Därför visar det tydligt att de färgade bilderna representeras av tredimensionella matriser, medan gråskalebilderna av tvådimensionella matriser.
Färgutrymmen
Färgrymden är hur bilderna lagras. RGB, HSV, CMYK är de olika färgrymdena, det här är bara enkla sätt att representera färg.
RGB - Röd, grön och blå.
HSV - Nyans, mättnad och värde.
Och CMYK används ofta i bläckstråleskrivare.
RGB- eller BGR-färgutrymme
OpenCVs standardfärgutrymme är RGB. RGB är en additiv färgmodell som genererar färger genom att kombinera blå, gröna och röda färger med olika intensitet / ljusstyrka. I OpenCV använder vi 8-bitars färgdjup.
- Röd (0-255)
- Blå (0-255)
- Grön (0-255)
Men OpenCV faktiskt lagrar färg i BGR format.
Rolig fakta: - Vi använder BGR-ordning i datorer på grund av hur osignerade 32-bitars heltal lagras i minnet, det slutar fortfarande lagras som RGB. Heltalet som representerar en färg t.ex.: - 0X00BBGGRR kommer att lagras som 0XRRGGBB.
HSV-färgutrymmeHSV (Hue, Saturation & value / Brightness) är ett färgutrymme som försöker representera färger som människorna uppfattar det. Den lagrar färginformation i en cylindrisk återgivning av RGB-färgpunkter.
Nyans - färgvärde (0-179)
Mättnad - Vibrans i färg (0-255)
Värde - Ljusstyrka eller intensitet (0-255)
HSV-färgrymdformat är användbart i färgsegmentering. I RGB är det inte lätt att filtrera specifik färg, men HSV gör det mycket lättare att ställa in färgintervall för att filtrera specifik färg som vi uppfattar dem.
Nyans representerar färgen i HSV, nyansvärdet sträcker sig från 0 - 180 och inte 360 så att den inte fullbordar hela cirkeln och så kartläggs den annorlunda än standarden.
Filter för färgintervall
- Röd - (165-15)
- Grön - (45-75)
- Blå - (90-120)
Som vi vet bilderna som lagras i RGB (rött, grönt och blått) färgutrymme och så visar OpenCV oss detsamma, men det första vi ska komma ihåg om opencvs RGB-format är att det faktiskt är BGR och vi kan veta det genom att titta på bildform.
importera cv2 importera numpy som np image = cv2.imread ('input.jpg') # B, G, R-värde för den första 0,0 pixeln B, G, R = bildutskrift (B, G, R) utskrift (bild.shape) # nu om vi tillämpar detta på gråskalebild grå_img = cv2.cvtColor (bild, cv2.COLOR_BGR2GRAY) tryck (grå_img.form) #grå_bild pixelvärde för 10,50 pixelutskrift (grå_img)
Konsolutgång: tryck (B, G, R) - 6 11 10
tryck (bild.form) - (183, 275, 3)
tryck (grå_form. form) - (183, 275)
tryck (grå_img) - 69
Nu finns det bara två dimensioner i en gråskalebild, eftersom vi kommer ihåg att färgbilden lagras i tre dimensioner, den tredje dimensionen är (R, G, B) medan i gråskala endast två dimensioner finns, eftersom (R, G, B) är frånvarande och för en viss pixelposition får vi bara ett enda värde medan vi i färgad bild har tre värden.
Ett annat användbart färgutrymme är HSV
importera 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 att ha kört koden kan du se de fyra bilderna av vilka tre är av de enskilda kanalerna och en kombinerad HSV-bild.
Hue-kanalbilden är ganska mörk eftersom dess värde bara varierar från 0 till 180.
Observera också att imshow- funktionen försöker visa RGB- eller BGR-bilden, men HSV-konvertering överlappar den.
Värdekanalen liknar också bildens gråskala på grund av dess ljusstyrka.
Utforska enskilda komponenter i RGB-bilden
importera cv2 image = cv2.imread ('input.jpg') # opencv's split-funktion delar upp bilden i varje färgindex B, G, R = cv2.split (image) cv2.imshow ("Red", R) cv2.imshow ("Grön", G) cv2.imshow ("Blå", B) # skapar originalbilden genom att slå samman de enskilda färgkomponenterna sammanslagna = cv2.merge () cv2.imshow ("sammanslagna", sammanslagna) #förstärka den blåa färgen sammanslagna = cv2.merge () cv2.imshow ("sammanfogad med blå förstärkning", sammanfogad) # representerar formen på enskilda färgkomponenter. # utgången skulle bara vara tvådimension som skulle vara höjd och bredd, eftersom det tredje elementet i RGB-komponenten är individuellt representerat tryck (B. form) utskrift (R.form) tryck (G. form) cv2.waitKey (0) cv2.destroyAllWindows ()
Konsolutgång : #dimensioner av bild från formfunktion
(183, 275)
(183, 275)
(183, 275)
Konverterar bild till enskild RGB-komponent
I koden nedan har vi skapat en matris av nollor med dimensionerna för bilden HxW, noll returnerar en array fylld med nollor men med samma dimensioner.
Formfunktionen är väldigt användbar när vi tittar på dimensionen på en bild, och här har vi gjort skärning av den formfunktionen. Så form skulle ta allt upp till angivna punkter, dvs upp till andra utsedda punkter som skulle vara höjd och bredd på bilden som tredje representerar RGB-komponenten i bilden och vi behöver inte det här.
importera cv2 importera numpy som np image = cv2.imread ('input.jpg') B, G, R = cv2.split (image) nollor = 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 ()
Histogramrepresentation av bilden
Histogrambild av bilden är metoden för att visualisera bildkomponenterna.
Följande kod låter dig analysera bilden genom färghistogrammet för dess kombinerade och individuella färgkomponenter.
importera cv2 importera numpy som np # vi behöver importera matplotlib för att skapa histogramdiagram importera matplotlib.pyplot som plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (,, None,,) #we plot a histogram, ravel () planar vår bildmatris plt.hist (image.ravel (), 256,) plt.show () #viewing separata färgkanaler color = ('b', 'g', 'r') # vi vet separera färgen och plotta var och en i histogram för i, kol i räkna upp (färg): histogram2 = cv2.calcHist (,, Ingen,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()
Låt oss förstå calcHist- funktionen med var och en av dess individuella parametrar
cv2.calcHist (bilder, kanaler, mask, storlek , intervall)
Bilder: det är källbilden av typen uint 8 eller float 32. Den ska ges i hakparenteser, dvs “”, som också anger dess andra nivå array eftersom en bild för opencv är data i en array-form.
Kanaler: den ges också i hakparenteser. Det är kanalindexet för vilket vi beräknar histogram, till exempel om ingången är en gråskalebild är dess värde, för färgbilder som du kan skicka, eller för att beräkna histogram för blå, grön respektive röd kanal.
Mask: maskbild. För att hitta histogrammet för hela bilden ges den som ”ingen”. men om du vill hitta histogrammet för en viss bildregion måste du skapa en maskbild för det och ge den som en mask.
Histsize: Detta representerar vårt BIN-antal. Behövs anges i hakparentes för fullskala vi passerar.
Områden: Detta är normalt vårt sortiment
Rita bilder och former med OpenCV
Nedan följer några exempel för att rita linjer, rektangel, polygon, cirkel etc i OpenCV.
importera cv2 import numpy som np #creating a black square image = np.zeros ((512,512,3), np.uint8) # vi kan också skapa detta i svartvitt, men det skulle inte finnas några ändringar image_bw = np.zeros ((512,512), np.uint8) cv2.imshow ("svart rektangel (färg)", bild) cv2.imshow ("svart rektangel (svartvitt)", image_bw)
Linje
# skapa en linje över svart kvadrat # cv2.line (bild, startkoordinater, slutkoordinater , färg, tjocklek) # ritning av en diagonal linje med tjocklek 5 pixlar image = np. nollor ((512,512,3), np.uint8) cv2.line (bild, (0,0), (511,511), (255,127,0), 5) cv2.imshow ("blå linje", bild)
Rektangel
# skapa en rektangel över en svart fyrkant # cv2.rectangle (bild, startkoordinater, slutkoordinater , färg, tjocklek) # Rita en rektangel med tjocklek 5 pixlar image = np. nollor ((512,512,3), np.uint8) cv2. rektangel (bild, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("rektangel", bild)
#skapa en cirkel över en svart fyrkant # cv2.circle (bild, mitt, radie, färg, fyll) bild = np. nollor ((512,512,3), np.uint8) cv2.circle (bild, (100,100), (50), (255,127,0), - 1) cv2.imshow ("cirkel", bild)
#creating a polygon image = np.zeros ((512,512,3), np.uint8) #lets definierar fyra punkter pts = np.array (,,,], np.int32) #lets formar nu våra punkter i form som krävs av polylinjer pts = poäng.omformning ((- 1,1,2)) cv2.polyliner (bild,, sant, (0,255,255), 3) cv2.imshow ("polygon", bild)
# att sätta text med hjälp av opencv # cv2.putText (bild, 'text att visa', startpunkt vänster startpunkt, teckensnitt, teckenstorlek, färg, tjocklek) image = np. nollor ((512,512,3), np.uint8) cv2. putText (bild, "hej värld", (75,290), cv2.FONT_HERSHEY_COMPLEX, 2, (100,170,0), 3) cv2.imshow ("hej värld", bild) cv2.waitKey (0) cv2.destroyAllWindows ()
Computer Vision och OpenCV är mycket stora ämnen att täcka men den här guiden skulle vara en bra utgångspunkt för att lära sig OpenCV och bildbehandling.