|
@@ -0,0 +1,131 @@
|
|
|
|
|
+from PIL import Image
|
|
|
|
|
+from numpy import asarray, ndarray, array, uint8, delete
|
|
|
|
|
+
|
|
|
|
|
+# image = Image.open("images/hibou.jpg")
|
|
|
|
|
+
|
|
|
|
|
+# image = image.convert("L")
|
|
|
|
|
+
|
|
|
|
|
+# img_array = asarray(image)
|
|
|
|
|
+
|
|
|
|
|
+# print(len(img_array[0])//3)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+### Fonctions ###
|
|
|
|
|
+
|
|
|
|
|
+def import_image(chemin: str) -> ndarray :
|
|
|
|
|
+ """Charge l'image donnée, la passe en nuances de gris, et la convertie en tableau (de numpy)"""
|
|
|
|
|
+
|
|
|
|
|
+ ## Chargement de l'image ##
|
|
|
|
|
+
|
|
|
|
|
+ # On essaie d'ouvrir l'image avec la librairie PIL
|
|
|
|
|
+ try:
|
|
|
|
|
+ image = Image.open(chemin)
|
|
|
|
|
+
|
|
|
|
|
+ # Gestion d'erreur si le fichier n'est pas accessible ou n'existe pas
|
|
|
|
|
+ except FileNotFoundError:
|
|
|
|
|
+ print("Le chemin d'accès est invalide.")
|
|
|
|
|
+ # TODO Set image sur une image blanche en cas d'erreur
|
|
|
|
|
+
|
|
|
|
|
+ # Gestion d'erreur dans les autres cas
|
|
|
|
|
+ except:
|
|
|
|
|
+ print("Une erreur s'est produite")
|
|
|
|
|
+ # TODO Pareil qu'au dessus
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ ## Conversion de l'image en nuances de gris ##
|
|
|
|
|
+
|
|
|
|
|
+ # On utilise la méthode .convert() de PIL
|
|
|
|
|
+ image = image.convert("L")
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ ## Conversion en tableau ##
|
|
|
|
|
+
|
|
|
|
|
+ # On utilise la fonction asarrray() de numpy
|
|
|
|
|
+ image_array = asarray(image)
|
|
|
|
|
+
|
|
|
|
|
+ return image_array
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def tab_image_blanche(longueur: int, hauteur: int) -> ndarray:
|
|
|
|
|
+ """Génère un tableau contenant des pixels blancs avec les dimensions données"""
|
|
|
|
|
+ # On crée autant de lignes que de pixels de hauteur, et autant de pixels que de hauteur
|
|
|
|
|
+ tab = [ [255] * longueur] * hauteur
|
|
|
|
|
+ return array(tab)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def get_longueur_img(tab_img: ndarray) -> int:
|
|
|
|
|
+ """Renvoie la longueur du tableau à deux dimensions (représentant une image) donné"""
|
|
|
|
|
+ return len(tab_img[0])
|
|
|
|
|
+
|
|
|
|
|
+def get_hauteur_img(tab_img: ndarray) -> int:
|
|
|
|
|
+ """Renvoie la hauteur du tableau à deux dimensions (représentant une image) donné"""
|
|
|
|
|
+ return len(tab_img)
|
|
|
|
|
+
|
|
|
|
|
+def assombrir_pixel(tab_img: ndarray, ligne: int, colonne: int) -> ndarray:
|
|
|
|
|
+ """Réduit de 51 (parce que c'est 255/5) les valeurs des couleurs du pixel à la position donnée."""
|
|
|
|
|
+ if tab_img[ligne][colonne] >= 51:
|
|
|
|
|
+ tab_img[ligne][colonne] = tab_img[ligne][colonne] - 51
|
|
|
|
|
+
|
|
|
|
|
+ return tab_img
|
|
|
|
|
+
|
|
|
|
|
+def generer_clous(tab_img: ndarray) -> list:
|
|
|
|
|
+ """Génère un tableau qui contient des tuples qui représentent des clous : deux coordonnées et un numéro de côté -> 0 pour le haut, 1 pour la droite, 2 pour le bas, 3 pour la gauche"""
|
|
|
|
|
+ liste_res = []
|
|
|
|
|
+
|
|
|
|
|
+ h = get_hauteur_img(tab_img)
|
|
|
|
|
+ l = get_longueur_img(tab_img)
|
|
|
|
|
+
|
|
|
|
|
+ for i in range(0, l, 10):
|
|
|
|
|
+ liste_res = liste_res + [(0, i, 0)]
|
|
|
|
|
+ for i in range(10, h, 10):
|
|
|
|
|
+ liste_res = liste_res + [(i, l - 1, 1)]
|
|
|
|
|
+ for i in range(0, l - 10, 10):
|
|
|
|
|
+ liste_res = liste_res + [(h - 1, i, 2)]
|
|
|
|
|
+ for i in range(10, h - 10, 10):
|
|
|
|
|
+ liste_res = liste_res + [(i, 0, 3)]
|
|
|
|
|
+
|
|
|
|
|
+ return liste_res
|
|
|
|
|
+
|
|
|
|
|
+def visible(clou1: tuple, clou2: tuple) -> bool:
|
|
|
|
|
+ """Renvoie True si les clous se voient, False sinon"""
|
|
|
|
|
+ return clou1[2] != clou2[2]
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+image = import_image("images/hibou.jpg")
|
|
|
|
|
+print(image)
|
|
|
|
|
+
|
|
|
|
|
+image_blanche = tab_image_blanche(get_longueur_img(image), get_hauteur_img(image))
|
|
|
|
|
+
|
|
|
|
|
+print(image_blanche)
|
|
|
|
|
+
|
|
|
|
|
+img = Image.fromarray(uint8(image_blanche))
|
|
|
|
|
+
|
|
|
|
|
+for i in range(0, 50):
|
|
|
|
|
+ for j in range(0, 50):
|
|
|
|
|
+ image_blanche = assombrir_pixel(image_blanche, i, j)
|
|
|
|
|
+
|
|
|
|
|
+img = Image.fromarray(uint8(image_blanche))
|
|
|
|
|
+#img.show()
|
|
|
|
|
+
|
|
|
|
|
+print(image_blanche)
|
|
|
|
|
+
|
|
|
|
|
+clous = generer_clous(image_blanche)
|
|
|
|
|
+print(clous)
|
|
|
|
|
+
|
|
|
|
|
+test = tab_image_blanche(111, 111)
|
|
|
|
|
+c = generer_clous(test)
|
|
|
|
|
+for i in range(0, len(c)):
|
|
|
|
|
+ test = assombrir_pixel(test, c[i][0], c[i][1])
|
|
|
|
|
+im_test = Image.fromarray(uint8(test))
|
|
|
|
|
+im_test.show()
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+### TODO ###
|
|
|
|
|
+
|
|
|
|
|
+# On peut essayer de regarder des clous aléatoire plutôt que de tout tester
|
|
|
|
|
+
|
|
|
|
|
+# On regarde l'erreur sur la ligne qu'on vient de tracer, en faisant des moyennes par zones
|
|
|
|
|
+
|
|
|
|
|
+# Pas forcément la même résolution pour le calcul que pour l'image
|
|
|
|
|
+
|
|
|
|
|
+# Pas forcément mesurer l'erreur d'une bande de quelques pixels au bord si on met les clous dedans
|