main.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. from PIL import Image
  2. from numpy import asarray, ndarray, array, uint8, delete
  3. # image = Image.open("images/hibou.jpg")
  4. # image = image.convert("L")
  5. # img_array = asarray(image)
  6. # print(len(img_array[0])//3)
  7. ### Fonctions ###
  8. def import_image(chemin: str) -> ndarray :
  9. """Charge l'image donnée, la passe en nuances de gris, et la convertie en tableau (de numpy)"""
  10. ## Chargement de l'image ##
  11. # On essaie d'ouvrir l'image avec la librairie PIL
  12. try:
  13. image = Image.open(chemin)
  14. # Gestion d'erreur si le fichier n'est pas accessible ou n'existe pas
  15. except FileNotFoundError:
  16. print("Le chemin d'accès est invalide.")
  17. # TODO Set image sur une image blanche en cas d'erreur
  18. # Gestion d'erreur dans les autres cas
  19. except:
  20. print("Une erreur s'est produite")
  21. # TODO Pareil qu'au dessus
  22. ## Conversion de l'image en nuances de gris ##
  23. # On utilise la méthode .convert() de PIL
  24. image = image.convert("L")
  25. ## Conversion en tableau ##
  26. # On utilise la fonction asarrray() de numpy
  27. image_array = asarray(image)
  28. return image_array
  29. def tab_image_blanche(longueur: int, hauteur: int) -> ndarray:
  30. """Génère un tableau contenant des pixels blancs avec les dimensions données"""
  31. # On crée autant de lignes que de pixels de hauteur, et autant de pixels que de hauteur
  32. tab = [ [255] * longueur] * hauteur
  33. return array(tab)
  34. def get_longueur_img(tab_img: ndarray) -> int:
  35. """Renvoie la longueur du tableau à deux dimensions (représentant une image) donné"""
  36. return len(tab_img[0])
  37. def get_hauteur_img(tab_img: ndarray) -> int:
  38. """Renvoie la hauteur du tableau à deux dimensions (représentant une image) donné"""
  39. return len(tab_img)
  40. def assombrir_pixel(tab_img: ndarray, ligne: int, colonne: int) -> ndarray:
  41. """Réduit de 51 (parce que c'est 255/5) les valeurs des couleurs du pixel à la position donnée."""
  42. if tab_img[ligne][colonne] >= 51:
  43. tab_img[ligne][colonne] = tab_img[ligne][colonne] - 51
  44. return tab_img
  45. def generer_clous(tab_img: ndarray) -> list:
  46. """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"""
  47. liste_res = []
  48. h = get_hauteur_img(tab_img)
  49. l = get_longueur_img(tab_img)
  50. for i in range(0, l, 10):
  51. liste_res = liste_res + [(0, i, 0)]
  52. for i in range(10, h, 10):
  53. liste_res = liste_res + [(i, l - 1, 1)]
  54. for i in range(0, l - 10, 10):
  55. liste_res = liste_res + [(h - 1, i, 2)]
  56. for i in range(10, h - 10, 10):
  57. liste_res = liste_res + [(i, 0, 3)]
  58. return liste_res
  59. def visible(clou1: tuple, clou2: tuple) -> bool:
  60. """Renvoie True si les clous se voient, False sinon"""
  61. return clou1[2] != clou2[2]
  62. image = import_image("images/hibou.jpg")
  63. print(image)
  64. image_blanche = tab_image_blanche(get_longueur_img(image), get_hauteur_img(image))
  65. print(image_blanche)
  66. img = Image.fromarray(uint8(image_blanche))
  67. for i in range(0, 50):
  68. for j in range(0, 50):
  69. image_blanche = assombrir_pixel(image_blanche, i, j)
  70. img = Image.fromarray(uint8(image_blanche))
  71. #img.show()
  72. print(image_blanche)
  73. clous = generer_clous(image_blanche)
  74. print(clous)
  75. test = tab_image_blanche(111, 111)
  76. c = generer_clous(test)
  77. for i in range(0, len(c)):
  78. test = assombrir_pixel(test, c[i][0], c[i][1])
  79. im_test = Image.fromarray(uint8(test))
  80. im_test.show()
  81. ### TODO ###
  82. # On peut essayer de regarder des clous aléatoire plutôt que de tout tester
  83. # On regarde l'erreur sur la ligne qu'on vient de tracer, en faisant des moyennes par zones
  84. # Pas forcément la même résolution pour le calcul que pour l'image
  85. # Pas forcément mesurer l'erreur d'une bande de quelques pixels au bord si on met les clous dedans