Bildförbättring i Python

Låt mig starta denna handledning genom att ta lite teoretiskt jargong ut ur din väg. När vi pratar om bildförbättring, detta innebär i grunden att vi vill ha en ny version av bilden som är mer lämplig än den ursprungliga. 

När du till exempel skannar ett dokument kan utmatningsbilden ha en lägre kvalitet än den ursprungliga inmatningsbilden. Vi behöver sålunda ett sätt att förbättra kvaliteten på utdata bilder så att de kan vara visuellt mer uttrycksfulla för betraktaren, och det är här bildförstärkningen kommer till spel. När vi förbättrar en bild skärper vi bildegenskaperna, som dess kontrast och kanter.

Det är viktigt att notera att bildförbättring inte ökar bildens innehållsinnehåll, utan ökar det dynamiska intervallet för de valda funktionerna, så småningom ökar bildens kvalitet. Så här vet vi faktiskt inte hur utmatningsbilden skulle se ut, men vi borde kunna berätta (subjektivt) om det var några förbättringar eller inte, till exempel att observera mer detaljer i utmatningsbilden, till exempel.

Bildförbättring används vanligen som ett förbehandlingssteg i de grundläggande stegen som är involverade i digital bildbehandling (dvs segmentering, representation). Det finns många tekniker för bildförbättring, men jag kommer att täcka två tekniker i denna handledning: bild invers och power law transformation. Vi ska titta på hur vi kan implementera dem i Python. Så, låt oss börja!

Bild omvänd

Som du kanske har gissat från titeln på det här avsnittet (som även kan kallas som bild negation), omvandlar bildinvertera de mörka intensiteterna i inmatningsbilden till ljusintensiteter i utmatningsbilden och ljusintensiteter i inmatningsbilden till mörka intensiteter i utmatningsbilden. Med andra ord blir de mörka områdena ljusare och ljusytorna blir mörkare.

Säg det I (i, j) refererar till intensitetsvärdet för pixeln som ligger vid (I j). För att klargöra lite här faller intensitetsvärdena i gråskalebilden inom intervallet [0255], och (I j) hänvisar till raden respektive kolumnvärdena. När vi tillämpar den bildomvända operatören på en gråskalebild, kommer utmatningspixeln O (i, j) värdet kommer att vara:

O (i, j) = 255 - I (i, j)

Numera är de flesta av våra bilder färgbilder. Dessa bilder innehåller tre kanaler, röd, grön, och blå, kallad RGB bilder. I detta fall, i motsats till ovanstående formel, måste vi subtrahera intensiteten hos varje kanal från 255. Så kommer utmatningsbilden att ha följande värden vid pixel (I j):

OJ (i, j) = 255 - G (i, j) O-B) i, j) = 255 - B (i, j)

Efter denna introduktion, låt oss se hur vi kan implementera bilden inverse operatören i Python. Jag skulle vilja nämna att för enkelhets skull kommer jag att köra operatören på en gråskalebild. Men jag kommer att ge dig några tankar om att använda operatören på en färgbild, och jag lämnar hela programmet för dig som en övning.

Det första du behöver göra för en färgbild är extrahera varje pixelkanal (dvs RGB) intensitetsvärde. För detta ändamål kan du använda Python Imaging Library (PIL). Gå vidare och hämta ett exempel baboon image från baboon.png. Bildens storlek är 500x500. Låt oss säga att du vill extrahera de röda, gröna och blåintensitetsvärdena som ligger på pixelplatsen (325, 432). Detta kan göras enligt följande:

från PIL import Image im = Image.open ('baboon.png') skriv ut im.getpixel ((325,432))

Baserat på dokumentationen, vilken metod getPixel () gör är:

Returnerar pixelvärdet vid en given position.

När du har kört ovanstående skript märker du att du bara får följande resultat: 138! Men var är de tre kanalernas (RGB) intensitetsvärden? Frågan verkar vara med läge av bilden som läses. Kontrollera läget genom att köra följande uttalande:

skriv ut im.mode

Du får utmatningen P, vilket betyder att bilden lästes i ett palettläge. En sak du kan göra är att konvertera bilden till RGB-läge innan du returnerar intensitetsvärdena för de olika kanalerna. För att göra det kan du använda konvertera() metod, enligt följande:

rgb_im = im.convert ('RGB')

I det här fallet får du följande värde returnerat: (180, 168, 178). Det betyder att intensitetsvärdena för de röda, gröna och blåa kanalerna är 180, 168 respektive 178.

För att sammanställa allt vi hittills har beskrivit, så kan Python-skriptet som returnerar RGB-värdena för en bild se följande:

från PIL import Image im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') utskrift rgb_im.getpixel ((325,432))

Det finns en punkt kvar innan du går framåt till den bildomvända operatören. Ovanstående exempel visar hur man hämtar RGB-värdet på ett pixel bara, men när du utför den inverse operatören måste du utföra det på Allt pixlarna. 

För att skriva ut alla intensitetsvärden för olika kanaler i varje pixel kan du göra följande:

från PIL import Image im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') bredd, höjd = im.size för w inom intervallet (bredd): för h i intervallet rgb_im.getpixel ((w, h))

Vid den här tiden kommer jag att lämna den som en övning för att du ska kunna räkna ut hur du applicerar den bildinverterade operatören på alla färgbildskanaler (dvs RGB) för varje bildpunkt.

Låt oss titta på ett exempel som tillämpar den bildinverterade operatören på en gråskalebild. Gå vidare och ladda ner boat.tiff, som kommer att fungera som vår testbild i det här avsnittet. Så här ser det ut:

Jag ska använda SciPy bibliotek för denna uppgift. Python-skriptet för att applicera bilden inverse operatören på bilden ovan ska se ut som följer:

importera scipy.misc från scipy import misc från scipy.misc.pilutil import Bild 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örsta vi gjorde efter att ha läst bilden är att konvertera det till en nariray för att kunna tillämpa den bildinverterade operatören på den. Efter att ha ansökt operatören konverterar vi bara ndarrayen till en bild och sparar den bilden som result.tiff. Figuren nedan visar resultatet av att applicera bilden invers mot ovanstående bild (originalbilden är till vänster och resultatet av att applicera bilden inverse operatören är till höger):

Observera att vissa funktioner i bilden blev tydligare efter att ha använts operatören. Titta till exempel vid molnen och fyren i rätt bild.

Power Law Transformation

Denna operatör, också kallad gammakorrigering, är en annan operatör som vi kan använda för att förbättra en bild. Låt oss se operatörens ekvation. Vid pixeln (I j), operatören ser ut som följer:

p (i, j) = kI (i, j) ^ gamma

I (i, j) är intensitetsvärdet vid bildplatsen (I j); och k och gamma är positiva konstanter. Jag kommer inte att gå in i matematiska detaljer här, men jag tror att du kan hitta grundliga förklaringar av detta ämne i bildbehandlingsböcker. Det är emellertid viktigt att notera att i de flesta fall, k = 1, så vi kommer huvudsakligen att ändra värdet av gamma. Ovannämnda ekvation kan således reduceras till:

p (i, j) = I (i, j) ^ gamma

Jag ska använda OpenCV och numpy bibliotek här. Du kan vänligen kolla min handledning Introducera NumPy om du behöver lära dig mer om biblioteket. Vår testbild kommer igen att vara boat.tiff (fortsätt och ladda ner den).

Python-skriptet för att utföra Power Law Transformation-operatören ser ut som följer:

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)

Observera att gamma-värdet vi valde är 0,6. Figuren nedan visar originalbilden och resultatet av att man tillämpar Power Law Transformation-operatören på den bilden (den vänstra bilden visar originalbilden och den högra bilden visar resultatet efter att ha applicerat power law transformation operatoren).

Resultatet ovan var när gamma = 0,6. Låt oss se vad som händer när vi ökar gamma till 1,5, till exempel:

Observera att när vi ökar värdet på gamma blir bilden mörkare och vice versa.

Man kanske frågar vad användningen av kraftlagransformationen skulle kunna vara. Faktum är att de olika enheterna som används för bildupptagning, utskrift och visning svarar i enlighet med power law transformation operatören. Detta beror på det faktum att den mänskliga hjärnan använder gammakorrigering för att bearbeta en bild. Gammakorrigering anses till exempel vara viktig när vi vill att en bild ska visas korrekt (den bästa bildkontrasten visas i alla bilder) på en datorskärm eller tv-skärmar.

Slutsats

I den här handledningen har du lärt dig hur du förbättrar bilder med Python. Du har sett hur du markerar funktioner med hjälp av den bildinverterade operatören, och hur kraftövergången anses vara en avgörande operatör för att visa bilder korrekt på datorskärmar och tv-skärmar.

Tveka inte att se vad vi har till salu och studera på Envato-marknaden, och fråga eventuella frågor och ge din värdefulla feedback genom att använda foderet nedan.