PIL en Python de facile à difficile

Pour accéder aux algorithmes de traitement complexes, il convient d'analyser les schémas standard, avec lesquels je suggère de commencer.

Pour les exemples de traitement, une image avec différents jeux de couleurs sera utilisée:

image

Pour commencer, nous avons besoin de deux modules de bibliothèque:

from PIL import Image, ImageDraw 

Configurez des outils pour un travail futur confortable:

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

Commençons


Nous traiterons les images au format RVB. PIL prend également en charge le travail avec les formats 1, L, P, RVB, RVBA, CMJN, YCbCr, LAB, HSV, I, F.

Les valeurs de pixels dans l'image sont définies au format: (x, y), (rouge, vert, bleu) , où x, y sont les coordonnées et les valeurs numériques RVB sont comprises entre 0 et 255. Autrement dit, nous travaillons avec une image 8 bits.

Niveaux de gris


Une teinte grise apparaît dans le cas de l'égalité de toutes les palettes de couleurs, nous devons donc obtenir la valeur moyenne arithmétique sur les trois points:

 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") #    

image
Légère nuance
L'œil humain perçoit un spectre de couleurs différent de différentes manières. Personne ne vous donnera la formule exacte, car la perception des couleurs est différente pour chacun d'une manière ou d'une autre, mais si vous êtes intéressé, vous pouvez en lire plus ici et ici .


Inversion


L'inversion est obtenue en soustrayant la couleur actuelle de 255:

 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)) 

image

Inversion en niveaux de gris


En combinant les deux algorithmes précédents, vous pouvez écrire le code suivant:

 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)) 

image

Inversion sélective en niveaux de gris


Pour cet algorithme, vous devez déterminer la valeur seuil, que je prendrai pour 100:

 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)) 

image

Conclusion


Dans les articles suivants, j'aimerais parler de la façon d'aborder le filtrage d'image de manière plus locale en le divisant en zones, ainsi que de montrer les possibilités intéressantes de DFS dans les algorithmes de traitement d'image.

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


All Articles