I den här handledningen kommer vi att lära oss bildbehandling med scikit-image i Python.
Från fåniga statusuppdateringar till högprofilerad dokumentation, bilder har blivit en integrerad del av digital data. Därför kom behovet av att bearbeta bild. För att förbättra bilden, komprimera dem, extrahera data och analysera dem, används bildbehandling inom olika områden som artificiell intelligens, dataforensik, datorgrafik, medicinsk forskning och många fler.
På grund av dess växande popularitet och tillgången på många lättanvända bibliotek är Python ett utmärkt val för bildbehandling. Det finns många bildbehandlingsbibliotek tillgängliga i Python som Numpy, Scipy, Scikit, OpenCV, Python Image Library (PIL), etc. Denna handledning är fokuserad på Scikit-image.
Scikit-bild:
Scikit-Image är ett Python-paket med öppen källkod. Innan vi går djupare, låt oss kolla in grunderna i en digital bild.
En bild består av siffror som vi kan representera dem digitalt med 2D-matriser. Varje rutnät i en array representerar en pixel i bilden. Detta gör processen med bildsegmentering ganska enkel. Paketet scikit-image fungerar med NumPy-arrayer.
En digital bild kan grovt delas in i två typer av kanaler:gråskala och flerkanalig. Som namnet antyder kommer en gråskalebild bara att ha grå nyanser, som täcker olika toner av svart och vitt. De har ingen ytterligare färginformation. Flerkanalig RGB, den vanligaste, har 3 lager:röd, grön och blå. Olika metoder för färgmanipulation har introducerats i ytterligare innehåll.
Komma igång med Scikit-image
Här är hela steg för steg handledning för att arbeta med detta bibliotek i Python.
1. Installation
I kommandotolken skriver du helt enkelt-
pip install scikit-image
Och installationen är klar.
OBS:Om du får ett fel, finns det en chans att det beror på att du inte har NumPy och Scipy på ditt system och du kanske först måste installera dem manuellt.
2. Visar en bild
När vi börjar vår resa med scikit-image, är det allra första steget att importera paketet med skimage. Scikit innehåller en fil med några förladdade bilder i dem. För att komma åt dem, använd moduldata. Data har några standarddemobilder som kan användas för teständamål. Raket, kaffe, mynt, kamera, page, etc.
Det finns en annan modul-io. Denna modul innehåller alla funktioner som används för att läsa och skriva bilder.
from skimage import data, io image = data.coffee() io.imshow(image) io.show()
Ovanstående kod gäller imshow() och show() funktioner. imshow() visar en bild. show() visar de väntande bilderna i kö av imshow. Vi måste använda show() när du visar bilder från icke-interaktiva skal.
Utdata:
Därför har vi slutfört vår första kod och importerat en bild.
Låt oss nu importera en bild från en katalog i vårt system.
import os from skimage import io file = os.path.join('skimage_data', 'books.jpg') book = io.imread(file) io.imshow(book) io.show()
Utdata:
Fig 2.2 Importerad bokbild
3. Spara en bild
Är inte sparandet den viktigaste delen av någon typ av bildbehandling? Det kan göras genom att använda imsave() fungera. Imsave() tar platsen tillsammans med önskat namn och format och naturligtvis bilden som måste sparas som parametrar.
from skimage import data, io image = data.logo() io.imsave('skimage/logo.png', image)
Kör koden och klart! Bilden kommer att sparas på den valda platsen.
4. Formmanipulation med scikit-image
Formen på en bild spelar en viktig roll för att manipulera en bild. Du kan hämta storleken på en bild med hjälp av formattributet.
from skimage import data image = data.coffee() print(image.shape)
Utdata:
(400, 600, 3)
Här är 400 och 600 höjd respektive bredd. 3 indikerar att bilden är en flerfärgsbild.
Låt oss nu ändra storlek på den här bilden.
from skimage import data, io, transform image = data.coffee() img = transform.resize(image, (100, 100), anti_aliasing=True) io.imshow(img) io.show() print(img.shape)
Ändra storleksfunktionen för transformbiblioteket används. Utdata kommer att ge den ändrade storleken på bilden och skriva ut den nya storleken.
Utdata:
Fig 4.1 Ändrad kaffebild
(100, 100, 3)
Observera att när du zoomar in har bildkvaliteten försämrats.
Du kan till och med prova att rotera en bild med hjälp av transformbiblioteket.
from skimage import transform, io, data image = data.coffee() image_rotated = trasform.rotate(image, angle=45, resize=True) io.imshow(image) io.show()
Utdata:
Fig 4.2 Roterad kaffebild
Gå hela vägen 180º för en upp-och-ned-bild. Observera att parametern resize används; om det är avstängt, skulle rotationen göras med den ursprungliga storleken och du kan förlora vissa viktiga data. Som standard är storleksändring inställd False. Utdata kommer att visas som följande när storleksändringsflaggan inte är True.
5. Färgmanipulation med scikit-image
1.Gråskalebild
Gråskalebilder är helt enkelt en bild med nyanser av svart och vitt. De visar i princip ljusets intensitet och ger ingen annan färginformation. Den tonala representationen av bilden kan variera från 0 (ren svart) till 255 (ren vit).
2. Färgbild
Färgbilder har i stort sett 3 lager - röd, grön och blå (RGB). Dessa lager kallas kanaler. Du kan separera varje kanal (röd, grön, blå) så här-
from skimage import data, io image = data.chelsea() image[:, :, 0] = 0 io.imshow(image) io.show()
De andra färgkanalerna kan filtreras bort med [:, :, 1] eller [:, :, 2]. Så här kommer varje utdata att se ut som-
Fig 5.1 Filtrera bort färger
RGB-bilden kan konverteras till gråskala och vice versa. Beräkningskomplexiteten minskar när en gråskalebild används. Som diskuterats ovan anges formatet för bildformen som [höjd, bredd, kanal]. En gråskalebild skulle inte ha en kanal eftersom den inte ger någon färginformation.
from skimage import data, color image = data.astronaut() gray = color.rgb2grey(image) #conversion to grayscale color = color.grey2rgb(img) #back to colour print(gray.shape) print(color.shape)
Utdata:
(512, 512) (512, 512, 3)
Fig 5.2 Gråskalningsbild
Du kan prova samma sak med andra färgkanaler som HSV (nyans, mättnad, värde), CEILAB, XYZ, etc. Låt oss se ett exempel på en av dem kort-
- Nyans: Graden på färghjulet börjar med 0º vid rött, 120º vid blått, 240º vid det gröna och 360º tillbaka vid rött.
- Mättnad: Procentandelen färg, 0 är vit och 100 är fullfärg
- Värde: Mängden vit eller svart färg i en bild.
Fig 5.3 HSV-färgrymd
Vi tar ett exempel,
from skimage import data, io, color image = data.coffee() img = color.rgb2hsv(image) io.imshow(img) io.show()
Utdata:
Fig 5.4 RGB till HSV
Om du utforskar vidare kan en gråskalebild till och med tonas till önskad färg helt enkelt genom att nollställa andra färger. Så här gör du-
from skimage import data, io, color grayscale_image = data.camera() image = color.gray2rgb(grayscale_image) red_multiplier = [1, 0, 0] yellow_multiplier = [1, 1, 0] io.imshow(yellow_multiplier * image) io.show() io.imshow(red_multiplier * image) io.show()
Fig. 5.5 Bildtoning
6. Redigera en bild med scikit-image
1. Använda filter
Scikit-image innehåller en mängd olika bildredigeringsverktyg. Filtermodulen är en av dem som hjälper till med olika tröskeltekniker och applicering av många filteralgoritmer på en bild.
from skimage import filters from skimage import data, io image = data.astronaut() image_median = filters.median(image) io.imshow(image_median) io.show()
Median returnerar en utjämnad bild. Jämfört med originalet, så här kommer resultatet att se ut.
Fig 6.1 Jämn bild och originalbild
2. Justera ljusstyrkan
Exponeringsmodul i scikit-image är mycket användbar för att analysera bildens ljusintensiteter med hjälp av histogram.
from skimage import exposure, io, data image = data.rocket() image_bright = exposure.adjust_gamma(image, gamma=0.5) image_dark = exposure.adjust_gamma(image, gamma=2) io.imshow(image) io.show() io.imshow(image_bright) io.show() io.imshow(image_dark) io.show()
Som standard är gammavärdet 1.
Utdata:
Fig. 6.2 Original, ljusare och mörkare bilder (från vänster till höger)
7. Bildsegmentering med scikit-image
Processen att dela upp en bild i segment eller bättre känd som pixlar för att markera och upptäcka områden av intresse i en bild som skulle hjälpa till med en mer effektiv bildanalys kallas bildsegmentering. Det finns många algoritmer som Chan-Vese, Random walker, Felzenswalb, etc för att hjälpa till att segmentera en bild. Scikit tillhandahåller inbyggda moduler för några av dessa algoritmer i segmentering. Låt oss se ett mycket enkelt exempel på bildsegmentering.
#import the required modules and image from skimage import data, io, feature, segmentation image = data.coins() #use canny edge detector from feature module edges = feature.canny(image, sigma=3) #use mark_boundaries from segmentation module to mark the edges and display the image io.imshow(segmentation.mark_boundaries(image, edges)) io.show()
Funktionsmodulen innehåller ett brett utbud av funktioner för att uppnå objektdetektering och bildsegmentering. canny() funktion är en av dem. Det är en flerstegs kantdetektor som som namnet säger upptäcker kanterna på föremål som finns i bilden. Vi använde sigma-parametern som 3; detta minskar effektivt bruset och ger en tydlig kant.
En annan modul som används är segmentering. Segmenteringsmodulen som tidigare nämnts innehåller många algoritmer tillsammans med olika objektdetekterings- och bildsegmenteringsfunktioner. Vi använde mark_boundaries() som kommer att markera gränserna som upptäcks av canny edge-detektorn. Den körda koden kommer att visa följande utdata.
Fig. 7.1 Segmentering
8. Histogram
Wikipedia beskriver bildhistogram som en typ av histogram som fungerar som en grafisk representation av tonfördelningen i en digital bild. Intensiteten hos en bild vid varje pixel beroende på dess färg avbildas med hjälp av ett histogram. Det röda, det gröna och det blåa har vardera ett motsvarande histogram; intensiteterna är 0 vid rent svart och 255 vid rent vitt.
Låt oss ta ett enkelt exempel på ett histogram.
from skimage import data import matplotlib.pyplot as plt image = data.coins() histogram = plt.hist(image.ravel(), bins=8) plt.show()
Histogrammet plottas med hjälp av plt.hist() funktion för Matplotlib-biblioteket. Intensitetsintervallet, som nämnts tidigare, är från 0 till 255, dvs totalt 256 fack. Ibland behövs inte representera varje intensitetsvärde. I dessa fall kan vi kvantifiera dem i flera grupper som kallas papperskorgar. Här plottade vi histogrammet med 8 fack.
Utdata:
Fig. 8.1 Histogram
Låt oss ta ett annat exempel på histogram som använder scikits exponeringsmodul, tillsammans med matplotlib-biblioteket.
from skimage import data import matplotlib.pyplot as plt from skimage.exposure import histogram image = data.coins() hist = histogram(image) plt.plot(hist[0]) plt.show()
Utdata:
Fig 8.2 Histogram med Scikit
Obs:Se till att du har matplotlib-paketet installerat.
Histogrammet har många tillämpningar inom bildbehandling som inkluderar tröskelvärde, justering av ljusstyrka och kontrast, analys av en bild, etc. Tröskelvärde är känt för att vara den enklaste metoden för bildsegmentering.
9. Bildtröskelvärde med scikit-image
Tröskelvärde är väldigt praktiskt när det gäller att isolera objekt i en bild för applikationer som ansiktsigenkänning och objektdetektering. Det separerar främst bakgrunden från förgrunden och är därför den enklaste metoden för bildsegmentering.
Tröskelvärde fungerar bäst i bilder med hög kontrast. Det finns två typer av tröskelvärden i Scikit - Global och Local. Den globala tröskeln är histogrambaserad och fungerar bra med en enhetlig bakgrund. Den lokala tröskeln är adaptiv och används för bilder med ojämnt upplysta bakgrunder.
Grundläggande steg för tröskelvärde:
- Konvertera en RGB-bild till gråskala.
- Ange ett tröskelvärde, säg 127.
- Använd operatorn ">" för tröskelvärde och "<=" för inverterad tröskel.
- Visa bilden.
from skimage import data, io image = data.camera() thresh = 127 binary = image > thresh #binary = image <= thresh --for inverted thresholding io.imshow(binary) io.show()
Fig 9 Tröskel och inverterad tröskel
1. Global tröskel
Som nämnts ovan tillämpas global tröskelvärde när bilden är starkt kontrasterad och har en enhetlig bakgrund. Till att börja med, låt oss kalla alla globala tröskelalgoritmer. Om du använder dem på den valda bilden visas resultatet av flera bilder.
from skimage.filters import try_all_threshold from skimage import data, io image = data.page() thresh = try_all_threshold(image) io.show()
Utdata:
Fig 9.1.1 Alla globala trösklar
Eller så kan vi ta en av dem, antar, threshold_otsu.
from skimage.filters import threshold_otsu from skimage import data, io image = data.page() thresh = threshold_otsu(image) binary = image > thresh io.imshow(binary) io.show()
Utdata:
2. Lokal tröskel
Om du är osäker, använd den lokala tröskeln. Lokal tröskel delar upp bilden i små områden och tillämpar tröskelvärdet på den.
from skimage.filters import threshold_local from skimage import data, io image = data.page() thresh = threshold_local(image, block_size=35, offset=10) binary = image > thresh io.imshow(binary) io.show()
Vi har satt block_size till 35 och offset till 10, vilket är konstanten för att balansera den motsatta kontrasten för att få en tydligare bild.
Utdata:
Fig 9.2.1 Lokal tröskel
Genom observationer är det tydligt att Local threshold ger bättre resultat i detta fall.
Slutanteckningar
Som en sammanfattning av hela handledningen av scikit-image började vi med grundläggande installation och import av skimage-paketet. Därefter visade och sparade vi bilderna med hjälp av io-modulen. När vi gick vidare lärde vi oss formmanipulation följt av färgmanipulation i scikit-image. Under formmanipulation arbetade vi i princip med transformbibliotek för rotation och storleksändring av bilder. Färgmanipulation delade i grunden in bilderna i gråskala och färgade bilder. Användning av olika färgkanaler samt konverteringar mellan olika färgmodeller gjordes med hjälp av färgmodulen.
När vi avancerade djupare upptäckte vi att scikit-image i hög grad hjälper till att redigera bilder. Även om det kan finnas många verktyg för att effektivt uppnå önskade redigeringar, implementerade vi två av dem. Filtermodulen som använde medianfunktionen och exponeringsmodulen som justerade gammakorrigeringen av bilden.
Och slutligen kom vi fram till den mest betydande tillämpade metoden som har rikliga tillämpningar inom olika områden. Bildsegmenteringen. Bildsegmentering ledde oss till att inse att en digital bild i själva verket är en rad pixlade tal. Scikit-image tillhandahåller många bildsegmenteringsalgoritmer. När vi initierade ett grundläggande objektdetekteringsprogram, upptäckte vi kanter på objektet i bilden och markerade gränser.
Histogram ger explicita detaljer om bildintensiteten. Därför ritade vi histogram med både matplotlib och scikit-bildbibliotek. I slutändan avslutade vi vår resa genom scikit-bildinlärning och implementerade slutligen tröskelvärden. Det fanns olika algoritmer för att uppnå det optimala tröskelvärdet, och det var den enklaste metoden för att uppnå bildsegmentering.
Sammanfattningsvis finns det otaliga tillämpningar av scikit-image i bildbehandling och många fler avancerade funktioner som när de kombineras med andra bibliotek som NumPy och Scipy skulle ge fantastiska resultat. Scikit-bild som är pythonbaserad och extremt väldokumenterad är därför mycket att föredra.
Scikit-bilden är väl dokumenterad; du kan hitta detaljerad dokumentation på dess officiella webbplats, här.