Bildebehandling ved hjelp av Python

I en avisartikkel fra 1911 som diskuterte journalistikk og publisitet, og citerte avisredaktøren Tess Flanders, kom følgende uttrykk fram:

 Bruk et bilde. Det er verdt tusen ord.

En lignende setning opptrådte også i en avisannonse fra 1913 for Piqua Auto Supply House:

Et blikk er verdt tusen ord.

Jeg kommer ikke til å gå dypt inn i historiens saker. Denne introduksjonen var bare for å gjøre det litt morsomt, og vise hvordan uttrykkene gir oss en indikasjon på betydningen av bilder og hvordan de virkelig kan legge inn mye informasjon i dem. Jeg er sikker på at de fleste av oss innser det, spesielt når vi legger merke til hvordan et bilde kan holde i vårt sinn mer enn bare ren tekst.

Det er således ingen tvil om at bildene spiller en viktig rolle i vår kommunikasjon - ikke bare generelle bilder, men også spesialiserte bilder som medisinske bilder (for eksempel MR, Ultralyd, etc.).

Vi kan skaffe bilder gjennom ulike oppkjøpsenheter. For eksempel hentes bilder fra melanom (hudkreft) ved hjelp av et dermatoskop. Vi tar bilder av oss selv eller venner med et digitalkamera eller en smarttelefon. Noen ganger ser vi imidlertid noen problemer i bildene våre, som for eksempel uskarphet, noe som kan skyldes oppkjøpsenheten som brukes.

Men hva skal jeg gjøre i dette tilfellet? Du ble sendt noen medisinske bilder for å analysere, og du har ikke mulighet til å trekke tilbake slike bilder. Selv om du har tatt et bilde igjen, vil ikke oppløsningen du endrer, eller noen andre problemer du møter. Bildebehandling kommer til spill i slike situasjoner.

Jeg likte hvordan begrepet bildebehandling ble definert i Oxford ordbøker:

Analysen og manipuleringen av et digitalisert bilde, spesielt for å forbedre kvaliteten.

"Digitalisert bilde" her refererer til det faktum at bildet vurderes digitalt, det er det behandles av en datamaskin. 

Å få datamaskinen i dette spillet betyr å bruke et programmeringsspråk. I denne opplæringen vil jeg vise deg hvordan vi kan bruke Python programmeringsspråket til å utføre bildebehandlingsoppgaver på et bilde.

scikit-bilde

Biblioteket vi skal bruke for å utføre våre bildebehandlingsoppgaver er scikit-bilde. I følge papirets scikit-bilde: bildebehandling i Python:

scikit-image er et bildebehandlingsbibliotek som implementerer algoritmer og verktøy for bruk i forskning, utdanning og industriapplikasjoner. Den er utgitt under den liberale Modified BSD open source lisensen, gir en godt dokumentert API i Python programmeringsspråk, og er utviklet av et aktivt, internasjonalt team av samarbeidspartnere.

Det første vi må gjøre er å installere scikit-bilde. Instruksjoner for installering av biblioteket finner du på nedlastingssiden, og i denne veiledningen vil jeg vise deg hvordan du installerer biblioteket på en Mac OS X-maskin, da dette er hva jeg for tiden bruker ved å skrive denne opplæringen.

Som scikit-bilde er et eksternt bibliotek, det første vi må gjøre er installere det biblioteket. For det vil jeg bruke pip, som er (basert på Wikipedia):

Et pakkehåndteringssystem som brukes til å installere og administrere programvarepakker skrevet i Python. Mange pakker finnes i Python Package Index (PyPI).

Du kan følge trinnene som er nevnt i Python Packaging User Guide for installasjon pip, men hvis du har det Python 2.7.9 og høyere, eller Python 3.4 og høyere, har du allerede pip!

scikit-bilde Nå kan du enkelt installere ved å skrive følgende kommando (i Mac OS Xs terminal):

pip installere -U scikit-bilde

Vi har nå biblioteket installert og klar for litt bildebehandlingsmoro!

Testbildet vi skal bruke i denne opplæringen er baboon.png. Gå videre og last ned det, eller bruk ganske enkelt bildet du ønsker. Bildet ser slik ut:

Dimensjoner på et bilde

Noen ganger må vi vite dimensjonene til et bilde (mer på det i filtreringsdelen). For å sjekke dimensjonene på bildet vårt, kan vi bruke guess_spatial_dimensions () metode, som følger:

fra skimage import io, farge img = io.imread ('baboon.png') dimensjoner = color.guess_spatial_dimensions (img) utskrift dimensjoner

Utgangen av det ovennevnte skriptet er 3, noe som betyr at vi har et bilde som består av tre romlige dimensjoner.

Farge til gråtoner

Fra ovenstående avsnitt har vi lagt merke til at bildet vårt er et 3D-arraybilde (i RGBA-format med formen (..., ..., 4)). Hvordan visste jeg at det er i RGBA-format? Du kan bare gjøre følgende:

importer skimage.io som io fra skimage.color import rgb2gray img = io.imread ('baboon.png') print img.shape

I dette tilfellet vil du få denne utgangen: (512, 512, 4).

I denne delen ønsker vi å konvertere det opprinnelige fargede baboon.png-bildet til et gråtonet 2D-bilde (svart og hvitt). Dette kan enkelt gjøres ved å bruke følgende skript:

importer skimage.io som io fra skimage.color import rgb2gray img = io.imread ('baboon.png') img_grayscale = rgb2gray (img)

La oss fortsette og lagre det nye bildet (gråtoner) til en fil. Dette kan gjøres ved hjelp av imsave () funksjon, som følger (legg merke til at det nye bildet er i filen bavian-gs.png):

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

For å sjekke dimensjonene på bildet, kan vi bruke skriptet i forrige seksjon, i hvilket tilfelle du ville få 2 returnert. Eller du kan bruke img_grayscale.shape, som resulterer i 512x512. Så, vi har nå et 2D-bilde.

For å vise det nye gråtonebildet legger du til følgende på slutten av skriptet:

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

Resultatet ser slik ut: 

Bruke et filter til et bilde

I bildebehandling, filtrering utføres for å gjøre noen forbedringer i bildet. Generelt omfatter filtrering følgende operasjoner: kantforbedring, sletting og utjevning.

I denne delen skal jeg vise deg hvordan vi kan bruke Sobel-filteret på bildet vårt, og se hvordan utgangen ser ut etter å ha utført en slik operasjon. Jeg skal bruke eksemplet som vises på forsiden av scikit-bilde-nettstedet, men brukes på bildet vårt.

Skriptet for å bruke Sobel-filteret på bildet ser slik ut:

fra skimage import data, io, filtre img = io.imread ('baboon.png') kanter = filters.sobel (img) io.imshow (kanter) io.show ()

Hvis du kjører skriptet, merket du noen problemer? Ja, vi kunne ikke bruke operasjonen siden bildet må være et 2D-bilde. Så, i stedet for å bruke baboon.png, Vi må bruke vårt 2D-bilde, bavian-gs.png. Utgangen av denne operasjonen ser ut som følger:

Konklusjon

Det er mange bildebehandlingsoperasjoner, og scikit-bilde Python bibliotek gir oss mange interessante operasjoner vi kan utføre på bildene våre. Du kan se flere bildebehandlingsoperasjoner ved hjelp av dette biblioteket på nettsiden til scikit-bilde.

Lær python

Lær Python med vår komplette pythonveiledning, enten du er bare i gang eller du er en erfaren coder som ønsker å lære nye ferdigheter..