from PIL import Image, ImageOps import numpy as np import random as rd import math # Lecture de l'image et changement du contraste image = Image.open("./images/2.jpg",mode = 'r') image = ImageOps.autocontrast(image, cutoff=10) im = np.asarray(image) nb_lignes, nb_colones, nb_subpixel = np.shape(im) # nb_subpixel est le nombre d'élements d'un points (R, G, B) = 3 classe = [[-1 for i in range(nb_colones)] for j in range(nb_lignes)] # Tableau des classes de chaque éléments nb_classe = 8 # initialisation centres centres = [] for i in range(nb_classe) : ir = rd.randint(0,nb_lignes-1) jr = rd.randint(0,nb_colones-1) while [im[ir,jr,s] for s in range(nb_subpixel)] in centres : ir = rd.randint(0,nb_lignes-1) jr = rd.randint(0,nb_colones-1) centres.append([im[ir,jr,s] for s in range(nb_subpixel)]) # On prend des pixels aléatoires dans l'image, et on vérifie qu'ils sont tous differents # distance (voire pour prendre plus efficace ?) def distance(e1: list, e2: list) : # distance entre deux couleurs d = len(e1) res = 0 for i in range(d) : res = max(res,(e1[i]-e2[i])**2) return(res) # ranger au plus proche des centres def classer() : # permet de classer les elements dans chaque classe global classe, im, nb_lignes, nb_colones, centres b = False for i in range(nb_lignes) : # On parcours toute l'image for j in range(nb_colones) : # -- dmin = 0 if classe[i][j] == -1 : # si il n'y a pas encore de classe dmin = math.inf # la distance est la minimum else : dmin = distance(im[i,j], centres[classe[i][j]]) for m in range(nb_classe) : dist = distance(list(im[i,j]), centres[m]) if dist