Python >> Python Program >  >> Python

Scikit-image, ett Python-baserat bildbehandlingsbibliotek

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:

  1. Konvertera en RGB-bild till gråskala.
  2. Ange ett tröskelvärde, säg 127.
  3. Använd operatorn ">" för tröskelvärde och "<=" för inverterad tröskel.
  4. 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.