Bildbehandling med Python

I en 1911-tidningsartikel som diskuterar journalistik och publicitet, och citerar tidningsredaktören Tess Flanders, framkom följande uttryck:

 Använd en bild. Det är värt tusen ord.

En liknande fras uppträdde också i en annons för 1913-tidningen för Piqua Auto Supply House:

En titt är värt tusen ord.

Jag kommer inte att gå djupt in i historia. Denna introduktion var bara för att göra det lite roligt och visa hur frasen ger oss en indikation på hur viktigt det är med bilder och hur de verkligen kan bädda in mycket information inom dem. Jag är säker på att de flesta av oss inser det, särskilt när vi märker hur en bild kan hålla sig i våra sinnen mer än bara ren text.

Det är således ingen tvekan om att bilderna spelar en viktig roll i vår kommunikation - inte bara allmänna bilder utan även specialiserade bilder som medicinska bilder (t.ex. MRI, Ultraljud etc.).

Vi kan få bilder via olika förvärvsenheter. Till exempel hämtas bilder från melanom (hudcancer) med hjälp av ett dermatoskop. Vi tar bilder av oss själva eller vänner med hjälp av en digitalkamera eller en smartphone. Ibland märker vi emellertid några problem i våra bilder, till exempel blurring, vilket kan bero på den förvärvade enheten som används.

Men vad ska man göra i det här fallet? Du har skickats några medicinska bilder för att analysera, och du har inte valet att återta sådana bilder. Även om du återvänder en bild, kommer den upplösning du ser inte att förändras, eller några andra problem du står inför. Bildbehandling kommer i spel i sådana situationer.

Jag gillade hur termen bildbehandling definierades i Oxford-ordböcker:

Analys och manipulation av en digitaliserad bild, speciellt för att förbättra dess kvalitet.

"Digitaliserad bild" här hänvisar till det faktum att bilden beaktas digital, det är det som behandlas av en dator. 

Att få datorn i det här spelet innebär att använda ett programmeringsspråk. I denna handledning kommer jag att visa dig hur vi kan använda Python programmeringsspråk för att utföra bildbehandlingsuppgifter på en bild.

scikit-bild

Biblioteket vi ska använda för att kunna utföra våra bildbehandlingsuppgifter är scikit-bild. Enligt pappersskissbilden: Bildbehandling i Python:

scikit-image är ett bildbehandlingsbibliotek som implementerar algoritmer och verktyg för användning i forskning, utbildning och industriapplikationer. Den släpps ut under den liberala Modified BSD Open Source-licensen, tillhandahåller ett väl dokumenterat API i Python programmeringsspråk och utvecklas av ett aktivt, internationellt team av medarbetare.

Det första vi behöver göra är att installera scikit-bild. Instruktioner för att installera biblioteket finns på nedladdningsidan, och i den här handledningen visar jag hur du installerar biblioteket på en Mac OS X-maskin, eftersom det här är vad jag för närvarande använder för att skriva denna handledning.

Som scikit-bild är ett externt bibliotek, det första vi måste göra är Installera det biblioteket. För det ska jag använda pip, vilket är (baserat på Wikipedia):

Ett pakethanteringssystem som används för att installera och hantera mjukvarupaket som är skrivna i Python. Många paket finns i Python Package Index (PyPI).

Du kan följa stegen som nämns i Python Packaging User Guide för installation pip, men om du har det python 2.7.9 och högre, eller python 3,4 och högre har du redan pip!

scikit-bild Nu kan du enkelt installera genom att skriva följande kommando (i Mac OS X: s terminal):

pip installera -U scikit-image

Vi har nu biblioteket installerat och redo för lite bildbehandling sköna!

Testbilden som vi ska använda i den här handledningen är baboon.png. Gå vidare och ladda ner det, eller använd helt enkelt bilden av ditt val. Bilden ser ut som följer:

Mått på en bild

Ibland behöver vi veta dimensionerna på en bild (mer om det i filtreringsdelen). För att kontrollera dimensionerna på vår bild kan vi använda guess_spatial_dimensions () metod, enligt följande:

från skimage import io, färg img = io.imread ('baboon.png') dimensioner = color.guess_spatial_dimensions (img) utskriftsdimensioner

Utmatningen av ovanstående skript är 3, vilket innebär att vi har en bild bestående av tre rumsliga dimensioner.

Färg till gråskala

Från ovanstående avsnitt har vi märkt att vår bild är en 3D-array-bild (i RGBA-format med formen (..., ..., 4)). Hur visste jag att det är i RGBA-format? Du kan helt enkelt göra följande:

importera skimage.io som io från skimage.color import rgb2gray img = io.imread ('baboon.png') print img.shape

I det här fallet skulle du få den här utmatningen: (512, 512, 4).

I det här avsnittet vill vi konvertera den ursprungliga färgade baboon.png-bilden till en gråskala 2D-bild (svartvitt). Detta kan enkelt göras med hjälp av följande skript:

importera skimage.io som io från skimage.color import rgb2gray img = io.imread ('baboon.png') img_grayscale = rgb2gray (img)

Låt oss fortsätta och spara den nya bilden (gråskala) till en fil. Detta kan göras med hjälp av imsave () funktion, enligt följande (observera att den nya bilden finns i filen babian-gs.png):

io.imsave ( 'babian-gs.png', img_grayscale)

För att kontrollera bildens dimensioner kan vi använda skriptet i föregående avsnitt, i vilket fall du skulle få 2 returnerad. Eller du kan använda img_grayscale.shape, vilket resulterar i 512x512. Så vi har nu en 2D-bild.

För att visa den nya gråskalebilden lägger du till följande i slutet av skriptet:

show_grayscale = io.imshow (img_grayscale) io.show ()

Resultatet ser ut så här: 

Tillämpa ett filter på en bild

Vid bildbehandling, filtrering utförs för att göra några förbättringar i bilden. I allmänhet omfattar filtrering följande åtgärder: kantförbättring, skärpning och utjämning.

I det här avsnittet ska jag visa hur vi kan applicera Sobel-filtret på vår bild och se hur utmatningen ser ut efter att ha utfört en sådan operation. Jag ska använda exemplet som visas på forsidan av scikit-bildwebbsidan, men tillämpas på vår bild.

Skriptet för att applicera Sobel-filtret på vår bild ser ut som följer:

från skimage import data, io, filter img = io.imread ('baboon.png') kanter = filters.sobel (img) io.imshow (kanter) io.show ()

Om du kör skriptet märkte du några problem? Ja, vi kunde inte tillämpa operationen eftersom bilden måste vara en 2D-bild. Så, istället för att använda baboon.png, Vi behöver använda vår 2D-bild, babian-gs.png. Resultatet av denna operation ser ut som följer:

Slutsats

Det finns många bildbehandlingsoperationer, och scikit-bild Python bibliotek ger oss många intressanta operationer som vi kan utföra på våra bilder. Du kan se fler bildbehandlingsoperationer med hjälp av det här biblioteket på webbplatsen för scikit-bild.

Lär Python

Lär dig Python med vår kompletta handledning för pythonhandledning, oavsett om du bara har börjat eller du är en erfaren kodare som vill lära dig nya färdigheter.