La meg starte denne opplæringen ved å ta litt teoretisk sjargong ut av veien. Når vi snakker om bildeforbedring, dette betyr i utgangspunktet at vi ønsker en ny versjon av bildet som er mer egnet enn den opprinnelige.
For eksempel, når du skanner et dokument, kan utdatabildet ha en lavere kvalitet enn det opprinnelige innspillingsbildet. Vi trenger dermed en måte å forbedre kvaliteten på utgangsbilder, slik at de kan være visuelt mer uttrykksfulle for betrakteren, og det er her bildet forbedring kommer inn i spill. Når vi forsterker et bilde, er det vi gjør med å skarpe bildefunksjonene som kontrast og kanter.
Det er viktig å merke seg at bildeforbedring ikke øker informasjonsinnholdet i bildet, men øker det dynamiske området for de valgte funksjonene, noe som til slutt øker bildekvaliteten. Så her vet vi faktisk ikke hvordan utdatabildet vil se ut, men vi bør kunne fortelle (subjektivt) om det var noen forbedringer eller ikke, for eksempel å observere flere detaljer i utgangsbildet, for eksempel.
Bildeforbedring brukes vanligvis som et forbehandlingstrinn i de grunnleggende trinnene som er involvert i digital bildebehandling (dvs. segmentering, representasjon). Det er mange teknikker for bildeforbedring, men jeg vil dekke to teknikker i denne opplæringen: bilde omvendt og kraft lov transformasjon. Vi vil se på hvordan vi kan implementere dem i Python. Så, la oss komme i gang!
Som du kanskje har gjettet fra tittelen på denne delen (som også kan refereres til som bilde negasjon), har bildet omvendt til å forvandle de mørke intensitetene i inngangsbildet til lyse intensiteter i utgangsbildet og lyse intensiteter i inngangsbildet til mørke intensiteter i utgangsbildet. Med andre ord blir de mørke områdene lettere, og lysområdene blir mørkere.
Si det I (i, j)
refererer til intensitetsverdien til pikselet plassert på (I, j)
. For å klargjøre litt her faller intensitetsverdiene i gråtonebildet i området [0255]
, og (I, j)
refererer til henholdsvis rad- og kolonneverdiene. Når vi bruker bildet omvendt operatør på et gråtonebilde, vil utgangspikselet O (i, j)
verdien vil være:
O (i, j) = 255 - I (i, j)
I dag er de fleste av bildene våre fargebilder. Disse bildene inneholder tre kanaler, rød, grønn, og blå, referert til som RGB
Bilder. I dette tilfellet, i motsetning til formelen ovenfor, må vi trekke intensiteten til Hver kanal fra 255. Så vil utdatabildet ha følgende verdier ved piksel (I, j)
:
O_R (i, j) = 255 - R (i, j) O_G (i, j) = 255 - G (i, j) O-B) i, j) = 255 - B (i, j)
Etter denne introduksjonen, la oss se hvordan vi kan implementere den image-inverse operatøren i Python. Jeg vil gjerne nevne at for enkelhets skyld vil jeg kjøre operatøren på et gråtonebilde. Men jeg vil gi deg noen tanker om å bruke operatøren på et fargebilde, og jeg vil legge hele programmet til deg som en øvelse.
Det første du må gjøre for et fargebilde, er å trekke ut hver pikselkanal (dvs. RGB) intensitetsverdi. For dette formålet kan du bruke Python Imaging Library (PIL). Gå videre og last ned et eksempel bavian bilde fra baboon.png. Størrelsen på bildet er 500x500
. La oss si at du vil pakke ut de røde, grønne og blå intensitetsverdiene som ligger på pikselplasseringen (325, 432)
. Dette kan gjøres på følgende måte:
fra PIL import Image im = Image.open ('baboon.png') skriv ut im.getpixel ((325,432))
Basert på dokumentasjonen, hvilken metode getpixel ()
gjør er:
Returnerer pikselverdien til en gitt posisjon.
Etter å ha kjørt det ovennevnte skriptet, vil du legge merke til at du bare får følgende resultat: 138
! Men hvor er de tre kanalene (RGB) intensitetsverdiene? Problemet synes å være med modus
av bildet som leses. Sjekk modusen ved å kjøre følgende setning:
skriv ut im.mode
Du får output P
, noe som betyr at bildet ble lest i en palettmodus. En ting du kan gjøre er å konvertere bildet til RGB-modus før du returnerer intensitetsverdiene til de forskjellige kanalene. For å gjøre det kan du bruke konvertere()
metode, som følger:
rgb_im = im.convert ('RGB')
I dette tilfellet vil du få følgende verdi returnert: (180, 168, 178)
. Dette betyr at intensitetsverdiene for de røde, grønne og blå kanalene er henholdsvis 180, 168 og 178.
For å sette sammen alt vi har beskrevet hittil, vil Python-skriptet som returnerer RGB-verdiene til et bilde se ut som følger:
fra PIL import Image im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') utskrift rgb_im.getpixel ((325,432))
Det er ett poeng igjen før du beveger deg videre til den bildeomvendte operatøren. Eksempelet ovenfor viser hvordan du henter RGB-verdien av en kun piksel, men når du utfører den inverse operatøren, må du utføre det på alle pikslene.
For å skrive ut alle intensitetsverdiene for de forskjellige kanalene til hver piksel, kan du gjøre følgende:
fra PIL import Image im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') bredde, høyde = im.size for w i rekkevidde (bredde): for h i rekkevidde (høyde): print rgb_im.getpixel ((w, h))
På dette punktet vil jeg la det være som en øvelse for å finne ut hvordan du bruker den bildeinnvendte operatøren på alle fargebildekanalene (dvs. RGB) av hver piksel.
La oss ta en titt på et eksempel som gjelder den image-inverse operatøren på et gråtonebilde. Gå videre og last ned boat.tiff, som vil tjene som vårt testbilde i denne delen. Slik ser det ut:
Jeg skal bruke scipy
bibliotek for denne oppgaven. Python-skriptet for å bruke den image-inverse operatøren på bildet ovenfor, bør se slik ut:
import scipy.misc fra scipy import misc fra scipy.misc.pilutil import Image im = Image.open ('boat.tiff') im_array = scipy.misc.fromimage (im) im_inverse = 255 - im_array im_result = scipy.misc.toimage (im_inverse) misc.imsave ('result.tiff', im_result)
Det første vi gjorde etter å ha lest bildet, er å konvertere det til en ndarray for å kunne bruke den omvendte operatøren på den. Etter å ha brukt operatøren, konverterer vi bare ndarrayen tilbake til et bilde og lagrer bildet som result.tiff
. Figuren under viser resultatet av å bruke bildet omvendt til bildet ovenfor (det opprinnelige bildet er til venstre, og resultatet av å bruke den bildeinnvendte operatøren er til høyre):
Legg merke til at noen funksjoner i bildet ble tydeligere etter at operatøren ble brukt. Se for eksempel på skyene og fyret i riktig bilde.
Denne operatøren, også kalt gamma korreksjon, er en annen operatør vi kan bruke til å forbedre et bilde. La oss se operatørens ligning. På piksel (I, j)
, operatøren ser ut som følger:
p (i, j) = kI (i, j) ^ gamma
I (i, j)
er intensitetsverdien på bildestedet (I, j)
; og k
og gamma
er positive konstanter. Jeg vil ikke gå inn i matematiske detaljer her, men jeg tror at du kan finne grundige forklaringer på dette emnet i bildebehandlingsbøker. Det er imidlertid viktig å merke seg at i de fleste tilfeller, k = 1
, så vi vil hovedsakelig endre verdien av gamma. Ovenstående ligning kan således reduseres til:
p (i, j) = I (i, j) ^ gamma
Jeg skal bruke OpenCV
og NumPy
biblioteker her. Du kan sjekke veiledningen min Introduksjon av NumPy bør du lære mer om biblioteket. Vårt testbilde vil igjen være boat.tiff (fortsett og last ned det).
Python-skriptet for å utføre Power Law Transformation-operatøren ser ut som følger:
import cv2 import numpy som np im = cv2.imread ('boat.tiff') im = im / 255,0 im_power_law_transformation = cv2.pow (im, 0,6) cv2.imshow ('Original Image', im) cv2.imshow Law Transformation ', im_power_law_transformation) cv2.waitKey (0)
Legg merke til at gammaverdien vi valgte er 0.6
. Figuren under viser det opprinnelige bildet og resultatet av å bruke Power Law Transformation-operatøren på det bildet (det venstre bildet viser det opprinnelige bildet, og det høyre bildet viser resultatet etter å ha brukt Power Law Transformation Operator).
Resultatet ovenfor var når gamma = 0,6
. La oss se hva som skjer når vi øker gamma til 1.5
, for eksempel:
Legg merke til at når vi øker verdien av gamma blir bildet mørkere, og omvendt.
Man kan spørre hva bruken av kraftloven omformingen kunne være. Faktisk reagerer de forskjellige enhetene som brukes til bildeoppkjøp, utskrift og visning i henhold til strømlovtransformasjonsoperatøren. Dette skyldes at den menneskelige hjernen bruker gammakorrigering til å behandle et bilde. For eksempel anses gamma-korreksjon som viktig når vi vil at et bilde skal vises riktig (den beste bildekontrast vises i alle bildene) på en dataskjerm eller TV-skjerm.
I denne opplæringen har du lært å forbedre bilder ved hjelp av Python. Du har sett hvordan du fremhever funksjoner ved hjelp av den image-inverse operatøren, og hvordan strømlovertransformasjonen betraktes som en avgjørende operatør for å vise bilder riktig på dataskjermer og TV-skjermer.
Videre, ikke nøl med å se hva vi har tilgjengelig for salg og for studier i Envato Market, og vær så snill å stille spørsmål og gi din verdifulle tilbakemelding ved å bruke feedet under.