PIL in Python von leicht bis schwer

Um zu den komplexen Verarbeitungsalgorithmen zu gelangen, lohnt es sich, Standardschemata zu analysieren, mit denen ich beginnen möchte.

Für Verarbeitungsbeispiele wird ein Bild mit verschiedenen Farbsätzen verwendet:

Bild

Zu Beginn benötigen wir zwei Bibliotheksmodule:

from PIL import Image, ImageDraw 

Richten Sie Tools für eine komfortable zukünftige Arbeit ein:

 image = Image.open('test.jpg') #   draw = ImageDraw.Draw(image) #     width = image.size[0] #   height = image.size[1] #   pix = image.load() #    

Fangen wir an


Wir werden Bilder im RGB-Format verarbeiten. PIL unterstützt auch die Arbeit mit den Formaten 1, L, P, RGB, RGBA, CMYK, YCbCr, LAB, HSV, I, F.

Die Pixelwerte im Bild werden im folgenden Format festgelegt: (x, y), (rot, grün, blau) , wobei x, y die Koordinaten sind und die numerischen Werte von RGB im Bereich von 0 bis 255 liegen. Das heißt, wir arbeiten mit einem 8-Bit-Bild.

Graustufen


Bei Gleichheit aller Farbpaletten erscheint ein Grauton, daher müssen wir den arithmetischen Mittelwert für alle drei Punkte ermitteln:

 for x in range(width): for y in range(height): r = pix[x, y][0] #     g = pix[x, y][1] # b = pix[x, y][2] # sr = (r + g + b) // 3 #  draw.point((x, y), (sr, sr, sr)) #  image.save("result.jpg", "JPEG") #    

Bild
Leichte Nuance
Das menschliche Auge nimmt ein unterschiedliches Farbspektrum auf unterschiedliche Weise wahr. Niemand wird Ihnen die genaue Formel geben, da die Wahrnehmung von Farben für jeden auf die eine oder andere Weise unterschiedlich ist, aber wenn Sie interessiert sind, können Sie hier und hier mehr lesen.


Inversion


Die Inversion wird durch Subtrahieren der aktuellen Farbe von 255 erhalten:

 for x in range(width): for y in range(height): r = pix[x, y][0] g = pix[x, y][1] b = pix[x, y][2] draw.point((x, y), (255 - r, 255 - g, 255 - b)) 

Bild

Graustufeninversion


Wenn Sie die beiden vorherigen Algorithmen kombinieren, können Sie den folgenden Code schreiben:

 for x in range(width): for y in range(height): r = pix[x, y][0] g = pix[x, y][1] b = pix[x, y][2] sr = (r + g + b) // 3 draw.point((x, y), (255 - sr, 255 - sr, 255 - sr)) 

Bild

Selektive Graustufeninversion


Für diesen Algorithmus müssen Sie den Schwellenwert bestimmen, den ich für 100 nehmen werde:

 for x in range(width): for y in range(height): r = pix[x, y][0] g = pix[x, y][1] b = pix[x, y][2] if (r+g+b)>100: #    100 ,    sr = (r + g + b) // 3 draw.point((x, y), (255-sr, 255-sr, 255-sr)) else: #    sr = (r + g + b) // 3 draw.point((x, y), (sr, sr, sr)) 

Bild

Fazit


In den folgenden Artikeln möchte ich darüber sprechen, wie die Bildfilterung lokaler durch Aufteilen in Bereiche angegangen werden kann, und interessante Möglichkeiten der DFS in Bildverarbeitungsalgorithmen aufzeigen

Source: https://habr.com/ru/post/de451074/


All Articles