Computer Vision är ett område som syftar till att ge datorer en hög nivå av förståelse för digitala bilder. Detta är en ganska bred definition, eftersom förståelse kan innebära många olika saker, inklusive att hitta ett objekt på en bild (objektdetektion), förstå vad som händer (händelsedetektion), beskriva en bild i text eller rekonstruera en scen i 3D. Det finns också specifika uppgifter relaterade till bilder av människor: ålders- och känsloestimering, ansiktsdetektion och identifiering, samt 3D-positionsestimering, för att nämna några.
En av de enklaste uppgifterna inom datorseende är bildklassificering.
Datorseende anses ofta vara en gren av AI. Idag löses de flesta uppgifter inom datorseende med hjälp av neurala nätverk. Vi kommer att lära oss mer om den speciella typen av neurala nätverk som används för datorseende, konvolutionella neurala nätverk, under denna sektion.
Men innan du skickar en bild till ett neuralt nätverk kan det i många fall vara vettigt att använda vissa algoritmiska tekniker för att förbättra bilden.
Det finns flera Python-bibliotek tillgängliga för bildbehandling:
- imageio kan användas för att läsa/skriva olika bildformat. Det stöder också ffmpeg, ett användbart verktyg för att konvertera videoramar till bilder.
- Pillow (även känt som PIL) är lite mer kraftfullt och stöder även viss bildmanipulation som morfning, palettjusteringar och mer.
- OpenCV är ett kraftfullt bildbehandlingsbibliotek skrivet i C++, som har blivit standard för bildbehandling. Det har ett bekvämt Python-gränssnitt.
- dlib är ett C++-bibliotek som implementerar många maskininlärningsalgoritmer, inklusive några av datorseendealgoritmerna. Det har också ett Python-gränssnitt och kan användas för utmanande uppgifter som ansikts- och ansiktslandmärkesdetektion.
OpenCV anses vara standard för bildbehandling. Det innehåller många användbara algoritmer, implementerade i C++. Du kan också använda OpenCV från Python.
En bra plats att lära sig OpenCV är denna Learn OpenCV-kurs. I vår kursplan är målet inte att lära sig OpenCV, utan att visa några exempel på när det kan användas och hur.
Bilder i Python kan bekvämt representeras av NumPy-arrayer. Till exempel skulle gråskalebilder med storleken 320x200 pixlar lagras i en 200x320-array, och färgbilder med samma dimension skulle ha formen 200x320x3 (för 3 färgkanaler). För att ladda en bild kan du använda följande kod:
import cv2
import matplotlib.pyplot as plt
im = cv2.imread('image.jpeg')
plt.imshow(im)Traditionellt använder OpenCV BGR (Blå-Grön-Röd) kodning för färgbilder, medan resten av Python-verktygen använder den mer traditionella RGB (Röd-Grön-Blå). För att bilden ska se rätt ut måste du konvertera den till RGB-färgrymden, antingen genom att byta dimensioner i NumPy-arrayen eller genom att kalla en OpenCV-funktion:
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)Samma cvtColor-funktion kan användas för att utföra andra färgrymdstransformationer, såsom att konvertera en bild till gråskala eller till HSV (Hue-Saturation-Value) färgrymden.
Du kan också använda OpenCV för att ladda videor bildruta för bildruta - ett exempel ges i övningen OpenCV Notebook.
Innan du matar en bild till ett neuralt nätverk kan du vilja tillämpa flera förbehandlingssteg. OpenCV kan göra många saker, inklusive:
- Ändra storlek på bilden med
im = cv2.resize(im, (320,200),interpolation=cv2.INTER_LANCZOS) - Suddighet på bilden med
im = cv2.medianBlur(im,3)ellerim = cv2.GaussianBlur(im, (3,3), 0) - Ändra ljusstyrka och kontrast på bilden kan göras med NumPy-arraymanipulationer, som beskrivs i denna Stackoverflow-notis.
- Använda tröskling genom att kalla
cv2.threshold/cv2.adaptiveThreshold-funktioner, vilket ofta är att föredra framför att justera ljusstyrka eller kontrast. - Tillämpa olika transformationer på bilden:
- Affina transformationer kan vara användbara om du behöver kombinera rotation, storleksändring och skevhet på bilden och du vet käll- och destinationspositionen för tre punkter i bilden. Affina transformationer håller parallella linjer parallella.
- Perspektivtransformationer kan vara användbara när du vet käll- och destinationspositionen för fyra punkter i bilden. Till exempel, om du tar en bild av ett rektangulärt dokument med en smartphonekamera från en viss vinkel och vill göra en rektangulär bild av själva dokumentet.
- Förstå rörelse i bilden genom att använda optisk flöde.
I vår OpenCV Notebook ger vi några exempel på när datorseende kan användas för att utföra specifika uppgifter:
- Förbehandling av ett fotografi av en Braille-bok. Vi fokuserar på hur vi kan använda tröskling, funktionsdetektion, perspektivtransformation och NumPy-manipulationer för att separera individuella Braille-symboler för vidare klassificering av ett neuralt nätverk.
![]() |
![]() |
![]() |
|---|
Bild från OpenCV.ipynb
- Detektera rörelse i video med hjälp av bildruteskillnad. Om kameran är fast, bör bildrutor från kameraflödet vara ganska lika varandra. Eftersom bildrutor representeras som arrayer, kan vi genom att subtrahera dessa arrayer för två efterföljande bildrutor få pixeldifferensen, som bör vara låg för statiska bildrutor och bli högre när det finns betydande rörelse i bilden.
Bild från OpenCV.ipynb
-
Detektera rörelse med hjälp av optiskt flöde. Optiskt flöde gör det möjligt för oss att förstå hur individuella pixlar på videobildrutor rör sig. Det finns två typer av optiskt flöde:
- Tätt optiskt flöde beräknar vektorfältet som visar för varje pixel var den rör sig.
- Gles optiskt flöde baseras på att ta några distinkta funktioner i bilden (t.ex. kanter) och bygga deras bana från bildruta till bildruta.
Bild från OpenCV.ipynb
✍️ Exempel Notebooks: OpenCV prova OpenCV i praktiken
Låt oss göra några experiment med OpenCV genom att utforska OpenCV Notebook
Ibland kan relativt komplexa uppgifter som rörelsedetektion eller fingertoppsdetektion lösas enbart med datorseende. Därför är det mycket användbart att känna till de grundläggande teknikerna inom datorseende och vad bibliotek som OpenCV kan göra.
Titta på denna video från AI-showen för att lära dig om Cortic Tigers-projektet och hur de byggde en blockbaserad lösning för att demokratisera datorseendeuppgifter via en robot. Gör lite forskning om andra projekt som detta som hjälper nya lärande att komma in i området.
Läs mer om optiskt flöde i denna utmärkta handledning.
I detta labb kommer du att ta en video med enkla gester, och ditt mål är att extrahera upp/ner/vänster/höger rörelser med hjälp av optiskt flöde.





