main.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. from PIL import Image
  2. from numpy import asarray, ndarray, array, uint8, delete
  3. from random import choice
  4. # image = Image.open("images/hibou.jpg")
  5. # image = image.convert("L")
  6. # img_array = asarray(image)
  7. # print(len(img_array[0])//3)
  8. ### Fonctions ###
  9. def import_image(chemin: str) -> ndarray :
  10. """Charge l'image donnée, la passe en nuances de gris, et la convertie en tableau (de numpy)"""
  11. ## Chargement de l'image ##
  12. # On essaie d'ouvrir l'image avec la librairie PIL
  13. try:
  14. image = Image.open(chemin)
  15. # Gestion d'erreur si le fichier n'est pas accessible ou n'existe pas
  16. except FileNotFoundError:
  17. print("Le chemin d'accès est invalide.")
  18. # TODO Set image sur une image blanche en cas d'erreur
  19. # Gestion d'erreur dans les autres cas
  20. except:
  21. print("Une erreur s'est produite")
  22. # TODO Pareil qu'au dessus
  23. ## Conversion de l'image en nuances de gris ##
  24. # On utilise la méthode .convert() de PIL
  25. image = image.convert("L")
  26. ## Conversion en tableau ##
  27. # On utilise la fonction asarrray() de numpy
  28. image_array = asarray(image)
  29. return image_array
  30. def tab_image_blanche(longueur: int, hauteur: int) -> ndarray:
  31. """Génère un tableau contenant des pixels blancs avec les dimensions données"""
  32. # On crée autant de lignes que de pixels de hauteur, et autant de pixels que de hauteur
  33. tab = [ [255] * longueur] * hauteur
  34. return array(tab)
  35. def tab_image_noir(longueur: int, hauteur: int) -> ndarray:
  36. """Génère un tableau contenant des pixels blancs avec les dimensions données"""
  37. # On crée autant de lignes que de pixels de hauteur, et autant de pixels que de hauteur
  38. tab = [ [0] * longueur] * hauteur
  39. return array(tab)
  40. def get_longueur_img(tab_img: ndarray) -> int:
  41. """Renvoie la longueur du tableau à deux dimensions (représentant une image) donné"""
  42. return len(tab_img[0])
  43. def get_hauteur_img(tab_img: ndarray) -> int:
  44. """Renvoie la hauteur du tableau à deux dimensions (représentant une image) donné"""
  45. return len(tab_img)
  46. def assombrir_pixel(tab_img: ndarray, ligne: int, colonne: int) -> ndarray:
  47. """Réduit de 51 (parce que c'est 255/5) les valeurs des couleurs du pixel à la position donnée."""
  48. if tab_img[ligne][colonne] >= 51:
  49. tab_img[ligne][colonne] = tab_img[ligne][colonne] - 51
  50. return tab_img
  51. def generer_clous(tab_img: ndarray) -> list:
  52. """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"""
  53. liste_res = []
  54. h = get_hauteur_img(tab_img)
  55. l = get_longueur_img(tab_img)
  56. for i in range(0, l, 10):
  57. liste_res = liste_res + [(0, i, 0)]
  58. for i in range(10, h, 10):
  59. liste_res = liste_res + [(i, l - 1, 1)]
  60. for i in range(0, l - 10, 10):
  61. liste_res = liste_res + [(h - 1, i, 2)]
  62. for i in range(10, h - 10, 10):
  63. liste_res = liste_res + [(i, 0, 3)]
  64. return liste_res
  65. def visible(clou1: tuple, clou2: tuple) -> bool:
  66. """Renvoie True si les clous se voient, False sinon"""
  67. return clou1[2] != clou2[2]
  68. def clou_choisi_al(liste_clous : list) -> tuple:
  69. """On choisie un clou aléatoirement"""
  70. return random.choice(liste_clous)
  71. def tracer_droite(clou1: tuple, clou2: tuple, image: list) -> list:
  72. """Trace une droite d'un clou à un autre."""
  73. if clou2[3]==clou1[3]:
  74. print("il est impossible de tracer un trait sur le même bord")
  75. else:
  76. pass
  77. def lst_zone(image) -> list:
  78. """Renvoie une liste avec les coordonées de chaques zones"""
  79. lst = []
  80. hauteur = get_hauteur_img(image)
  81. longueur = get_longueur_img(image)
  82. pas = 10
  83. for i in range(0,longueur,pas):
  84. for j in range(0,hauteur, pas):
  85. lst += [(i,j)] #prends les coordonnées du pixel en haut à gauche de chaque zone
  86. return lst
  87. def erreur_moyenne_zone(image1, image2, zone : tuple, longueur : int) -> float:
  88. """Renvoie l'erreur moyenne pour une zone"""
  89. haut = get_hauteur_img(image1)
  90. long = get_longueur_img(image1)
  91. coo1 = zone[0]
  92. coo2 = zone[1]
  93. pix1 = image1[coo1][coo2]
  94. pix2 = image2[coo1][coo2]
  95. diff = abs(pix1 - pix2)
  96. for i in range(coo1, coo1+longueur):
  97. for j in range(coo2, coo2+longueur):
  98. if i != 0 and j != 0:
  99. if i > long and j > haut:
  100. pix1 = image1[i][j]
  101. pix2 = image2[i][j]
  102. diff += abs(pix1 - pix2)
  103. return (diff / (longueur * longueur *255)) * 100
  104. def erreur(image1, image2, zones : list) -> float:
  105. """Renvoie l'erreur moyenne entre les deux images"""
  106. moy = 0
  107. for i in range(len(zones)):
  108. moy += erreur_moyenne_zone(image1, image2,zones[i])
  109. return moy/len(zones)
  110. image = import_image("images/hibou.jpg")
  111. print(image)
  112. image_blanche = tab_image_blanche(get_longueur_img(image), get_hauteur_img(image))
  113. image_noir = tab_image_noir(get_longueur_img(image), get_hauteur_img(image))
  114. print(image_blanche)
  115. img = Image.fromarray(uint8(image_blanche))
  116. for i in range(0, 50):
  117. for j in range(0, 50):
  118. image_blanche = assombrir_pixel(image_blanche, i, j)
  119. img = Image.fromarray(uint8(image_blanche))
  120. #img.show()
  121. print(image_blanche)
  122. clous = generer_clous(image_blanche)
  123. print(clous)
  124. test = tab_image_blanche(111, 111)
  125. c = generer_clous(test)
  126. for i in range(0, len(c)):
  127. test = assombrir_pixel(test, c[i][0], c[i][1])
  128. im_test = Image.fromarray(uint8(test))
  129. im_test.show()
  130. l_zones = lst_zone(image)
  131. print(erreur_moyenne_zone(image, image_blanche,l_zones[500],10))
  132. ### TODO ###
  133. # On peut essayer de regarder des clous aléatoire plutôt que de tout tester
  134. # On regarde l'erreur sur la ligne qu'on vient de tracer, en faisant des moyennes par zones
  135. # Pas forcément la même résolution pour le calcul que pour l'image
  136. # Pas forcément mesurer l'erreur d'une bande de quelques pixels au bord si on met les clous dedans