Skip to content
Snippets Groups Projects
Commit c4dc579c authored by Louis Chmielewski's avatar Louis Chmielewski
Browse files

distribute war.py

parent e42a6297
Branches
No related tags found
No related merge requests found
Showing
with 2315 additions and 6 deletions
No preview for this file type
......@@ -43,7 +43,7 @@ def decoupe_image(image: "Bloc", ordre: int) -> Bloc:
if ordre != 0:
blocs = en_4_blocs(image)
for bloc in blocs:
decoupe_image(bloc, ordre - 1, draw)
decoupe_image(bloc, ordre - 1)
if sont_4_blocs_uniformes_proches(blocs):
couleur_mid = moyenne_couleur(blocs)
......
......@@ -95,7 +95,7 @@ class ApQueue():
return the string representation of this queue.
"""
return ApQueue.ARROW + \
"|".join(str(el) for el in self.__content[::-1]) + \
"|".join(str(el) for el in self.__content) + \
ApQueue.ARROW
def __len__(self) -> int:
......
Tp08/war.py 100644 → 100755
......@@ -37,7 +37,14 @@ def distribute(n_card: int) -> tuple[ApQueue, ApQueue]:
$$$ isinstance(carte, Card)
True
"""
...
liste_carte = Card.deck(n_card*2)
h1 = ApQueue()
h2 = ApQueue()
for i in liste_carte[:n_card]:
h1.enqueue(i)
for j in liste_carte[n_card:]:
h2.enqueue(j)
return h1, h2
def gather_stack(main: ApQueue, pile: ApStack) -> None:
"""
......@@ -48,15 +55,14 @@ def gather_stack(main: ApQueue, pile: ApStack) -> None:
$$$ cartes = Card.deck(4)
$$$ main = ApQueue()
$$$ pile = ApStack()
$$$ for c in cartes:
... pile.push(c)
$$$ for c in cartes: pile.push(c)
$$$ gather_stack( main, pile )
$$$ len( main ) == 4
True
$$$ all( main.dequeue() == cartes[ 3 - i ] for i in range(3))
True
"""
...
def play_one_round(m1: ApQueue, m2: ApQueue, pile: ApStack) -> None:
"""
......
#Buhyari Ayoub
#classe bloc pour manipuler et structurer l'image
class Bloc:
"""Paramètres :
Initialise un bloc qui represente une partie de l'image
argument:
- px_hg = pixel haut gauche
- px_bd = pixel bas droit
- couleur = tuple de 3 valeur : r,v et b
"""
def __init__(self,px_hg,px_bd,couleur):
""" Initialise un bloc avec ses coins supérieur gauche et inférieur droit et sa couleur.
"""
self.px_hg = px_hg
self.px_bd = px_bd
self.couleur = couleur
self.size = (int(px_bd[0] - px_hg[0]), int(px_bd[1] - px_hg[1]))
def __str__(self):
return f"Bloc({self.px_hg},{self.px_bd},{self.couleur})"
def __repr__(self):
return f"Bloc({self.px_hg},{self.px_bd},{self.couleur})"
#BUHYARI Ayoub
#Partie decoupage
from Bloc import Bloc
from PIL import Image , ImageDraw
from algo_rec import *
from PIL import *
def couleur_proche(liste_bloc:list[Bloc] , seuil=20):
"""
si les 4 blocs sont de couleur proche renvoie True , Flase sinon
precondition: 4 elements blocs dans liste_bloc avec chacun une couleur
"""
for i in range(3):
couleur1 = liste_bloc[i].couleur
couleur2 = liste_bloc[i+1].couleur
max_diff = max(abs(couleur1[j] - couleur2[j]) for j in range(3))
if max_diff > seuil:
return False
return True
def fusion_4_bloc(liste_bloc:list[Bloc]):
"""
fusionne 4 bloc pour en former un seul
precondition: len(liste_bloc) == 4
"""
somme_r = 0
somme_v = 0
somme_b = 0
px_bd_x = max(liste_bloc[0].px_bd[0],liste_bloc[1].px_bd[0],liste_bloc[2].px_bd[0],liste_bloc[3].px_bd[0])
px_bd_y = max(liste_bloc[0].px_bd[1],liste_bloc[1].px_bd[1],liste_bloc[2].px_bd[1],liste_bloc[3].px_bd[1])
px_hg_x= min(liste_bloc[0].px_hg[0],liste_bloc[1].px_hg[0],liste_bloc[2].px_hg[0],liste_bloc[3].px_hg[0])
px_hg_y = min(liste_bloc[0].px_hg[1],liste_bloc[1].px_hg[1],liste_bloc[2].px_hg[1],liste_bloc[3].px_hg[1])
for bloc in liste_bloc:
r,v,b = bloc.couleur
somme_r = somme_r + r
somme_v = somme_v + v
somme_b = somme_b + b
return Bloc((px_hg_x,px_hg_y),(px_bd_x,px_bd_y),(somme_r/4,somme_b/4,somme_b/4))
def couleur_moyenne_image(image:Image):
"""
Calcule la couleur moyenne dune image pour l'ordre 0
precondition: aucune
"""
im_rgb = Image.open(image).convert("RGB")
largeur, hauteur = im_rgb.size
total_r = total_g = total_b = 0
for y in range(hauteur):
for x in range(largeur):
couleur_pixel = im_rgb.getpixel((x, y))
total_r += couleur_pixel[0]
total_g += couleur_pixel[1]
total_b += couleur_pixel[2]
nb_pixels = largeur * hauteur
couleur_moy_r = total_r // nb_pixels
couleur_moy_g = total_g // nb_pixels
couleur_moy_b = total_b // nb_pixels
return (couleur_moy_r, couleur_moy_g, couleur_moy_b)
def image_to_block(image_path):
image = Image.open(image_path).convert("RGB")
largeur, hauteur = image.size
return Bloc((0, 0), (largeur, hauteur), (None, None, None))
def divise_bloc(image_path: str, bloc: Bloc, ordre: int):
"""
Divise l'image en 4 sous-blocs et le fait récursivement jusqu'à ce que l'ordre soit atteint.
"""
sous_blocs = []
if ordre == 1:
px_hg, px_bd = bloc.px_hg, bloc.px_bd
largeur = px_bd[0] - px_hg[0]
hauteur = px_bd[1] - px_hg[1]
demi_largeur = largeur // 2
demi_hauteur = hauteur // 2
sous_blocs.append(Bloc(px_hg, (px_hg[0] + demi_largeur, px_hg[1] + demi_hauteur), (None, None, None)))
sous_blocs.append(Bloc((px_hg[0] + demi_largeur, px_hg[1]), (px_bd[0], px_hg[1] + demi_hauteur), (None, None, None)))
sous_blocs.append(Bloc((px_hg[0], px_hg[1] + demi_hauteur), (px_hg[0] + demi_largeur, px_bd[1]), (None, None, None)))
sous_blocs.append(Bloc((px_hg[0] + demi_largeur, px_hg[1] + demi_hauteur), px_bd, (None, None, None)))
else:
demi_largeur = (bloc.px_bd[0] - bloc.px_hg[0]) // 2
demi_hauteur = (bloc.px_bd[1] - bloc.px_hg[1]) // 2
sous_blocs += divise_bloc(image_path, Bloc(bloc.px_hg, (bloc.px_hg[0] + demi_largeur, bloc.px_hg[1] + demi_hauteur), (None, None, None)), ordre - 1)
sous_blocs += divise_bloc(image_path, Bloc((bloc.px_hg[0] + demi_largeur, bloc.px_hg[1]), (bloc.px_bd[0], bloc.px_hg[1] + demi_hauteur), (None, None, None)), ordre - 1)
sous_blocs += divise_bloc(image_path, Bloc((bloc.px_hg[0], bloc.px_hg[1] + demi_hauteur), (bloc.px_hg[0] + demi_largeur, bloc.px_bd[1]), (None, None, None)), ordre - 1)
sous_blocs += divise_bloc(image_path, Bloc((bloc.px_hg[0] + demi_largeur, bloc.px_hg[1] + demi_hauteur), bloc.px_bd, (None, None, None)), ordre - 1)
for bloc in sous_blocs:
bloc.couleur = couleur_moyenne_bloc(image_path, bloc)
return sous_blocs
def afficher_liste_blocs(liste_blocs:list[Bloc]):
"""
convertie une liste de bloc en une image
precondition: liste_blocs non vide
"""
max_x = max(bloc.px_bd[0] for bloc in liste_blocs)
max_y = max(bloc.px_bd[1] for bloc in liste_blocs)
image = Image.new("RGB", (max_x + 1, max_y + 1), "white")
draw = ImageDraw.Draw(image)
for bloc in liste_blocs:
draw.rectangle([bloc.px_hg, bloc.px_bd], fill=bloc.couleur)
image.show()
def couleur_moyenne_bloc(image:Image, bloc:Bloc):
"""
calcule la couleur moyenne dune bloc
precondition:
"""
im = Image.open(image)
im_rgb = im.convert("RGB")
total_r = 0
total_g = 0
total_b = 0
for y in range(bloc.px_hg[1], bloc.px_bd[1]):
for x in range(bloc.px_hg[0], bloc.px_bd[0]):
couleur_pixel = im_rgb.getpixel((x, y))
total_r += couleur_pixel[0]
total_g += couleur_pixel[1]
total_b += couleur_pixel[2]
nb_pixels = (bloc.px_bd[0] - bloc.px_hg[0]) * (bloc.px_bd[1] - bloc.px_hg[1])
couleur_r = total_r // nb_pixels
couleur_g = total_g // nb_pixels
couleur_b = total_b // nb_pixels
return (couleur_r, couleur_g, couleur_b)
(1) commande 1 : python image_rec.py ./Images/fichier.png ordre nouvelle_image enregistre-png
parametre: image , ordre , nouvelle_image enregistre-png
description:
enregistre une image png apres lui avoir appliquer l'algo recurcive
Exemple: python image_rec.py ./Images/calbuth.png 3 calbuth_ordre_3 enregistre-png
(2) commande 2 :python image_rec.py image ordre nouveau_fichier_csv enregistre-csv
parametre: image , ordre , nouvelle_image enregistre-csv
Description:
enregistre une image png dans un document csv
Exemple: python image_rec.py ./Images/calbuth.png 3 csv_calbuth_3 enregistre-csv
(3) commande 3 : python image_rec.py chemin_vers_image ordre affiche-png
parametre : chemin vers image , ordre affiche-png
Description
affiche un document png decoupait selon lordre apres avoir appliquer l'algo_rec
Exemple: python image_rec.py ./Images/joconde.png 3 affiche-png
affiche la joconde a l'ordre 3
(4) commande 4 : python image_rec.py document_csv affiche-csv
parametre : chemin vers fichier csv
Description:
affiche un document csv
Exemple : python image_rec.py ./Images/mystere.csv affiche-csv
affiche le document mystere
projet-ayoub-buyhari/Images/calbuth.png

25.9 KiB

projet-ayoub-buyhari/Images/galets.png

129 KiB

projet-ayoub-buyhari/Images/joconde.png

117 KiB

This diff is collapsed.
- - -
Title: Projet
author: Buhyari Ayoub
- - -
#journal
POUR LES ORDRES >4 IL FAUT ATTENDRE UN PEU DE TEMPS QUE LES CALCULES SE FONT SUR LE TERMINAL POUR QUE CELA S'AFFICHE (exemple 30 secondes pour l'ordre 5)
Mercredi 27/03: realisation de la class Bloc
Jeudi 28/03: comprehension de la recurcivité + fonction decoupage : couleur_proche et fusion_4_bloc que je sais pas comment relier a mon algo principale image_rec
Samedi 29/03:
realisation d'une fonction qui convertie image en bloc et fonction qui divise bloc recurcivement en liste de sous_bloc (une liste avec des blocs) -> pas liste de liste de bloc etc
Lundi 01/04: partie ligne de commande fini avec 3 commandes - une pour enregistrer l'image au format png
- une pour enregistrer l'image au format csv
- une pour afficher l'image seulement qui est elle meme au format png au debut et a la fin de l'algo
-affiche un document csv en une image
#Documentation
Fichier n*1: Decoupage
(1)
couleur_proche : parametre:liste_bloc return: bool
description:
calcule si une liste de 4 bloc sont de couleur proche
(2)
fusion_4_bloc: parametre:liste_bloc return: Bloc
description:
fusionne 4 blocs pour en former 1 (utile pour couleur_proche)
(3)
couleur_moyenne_image: parametre:Image return: tuple (r,v,b)
description:
calcule la moyenne d'une image donnée (utile pour ordre 0)
(4)
image_to_block: parametre: image return: Bloc
convertie une image en un bloc sans couleur
(5)
divise_bloc: parametre:bloc ordre:entier>0
description:
divise un bloc en plusieur sous bloc selon l'ordre choisit
(6)
affiche_liste_bloc: parametre:liste de bloc
description:
convertie une liste de bloc en une image
(7)
couleur_moyenne_bloc: parametre:image et un bloc return:couleur moyenne dune bloc
description:
prend un bloc dune image et fait la moyenne des couleurs de ce bloc et renvoie une couleur
Fichier 2: algo_rec
(1)
image_rec: parametre:image , ordre>0 return:liste de bloc
description:
renvoie une liste de bloc donc l'image decoupait selon un ordre
fichier 3: enregistrement_lecture_image
(1)
csv_to_blocks: parametre: un fichier csv return: liste de bloc
description:
convertie un fichier csv en une liste de bloc
(2)
bloc_to_image: parametre: nouvelle_image , liste de bloc return: une image
description:
convertie un bloc en une image et l'enregistre
(3)
CSV_to_Image: parametre:fichier_csv, nouvelle_image return:image
description:
convertie un fichier csv en une image
(4)
bloc_to_csv: parametre:liste_bloc et un fichier_csv return: un fichier csv
(5)
image_to_csv: parametre: liste de bloc et un fichier_csv return None
description:
convertie une image en un document csv
Fichier 4: image_rec
fichier qui relie le programme a mon projet
(1) commande 1 : python image_rec.py ./Images/fichier.png ordre nouvelle_image enregistre-png
parametre: image , ordre , nouvelle_image enregistre-png
description:
enregistre une image png apres lui avoir appliquer l'algo recurcive
Exemple: python image_rec.py ./Images/calbuth.png 3 calbuth_ordre_3 enregistre-png
(2) commande 2 :python image_rec.py image ordre nouveau_fichier_csv enregistre-csv
parametre: image , ordre , nouvelle_image enregistre-csv
Description:
enregistre une image png dans un document csv
Exemple: python image_rec.py ./Images/calbuth.png 3 csv_calbuth_3 enregistre-csv
(3) commande 3 : python image_rec.py chemin_vers_image ordre affiche-png
parametre : chemin vers image , ordre affiche-png
Description
affiche un document png decoupait selon lordre apres avoir appliquer l'algo_rec
Exemple: python image_rec.py ./Images/joconde.png 3 affiche-png
affiche la joconde a l'ordre 3
(4) commande 4 : python image_rec.py document_csv affiche-csv
parametre : chemin vers fichier csv
Description:
affiche un document csv
Exemple : python image_rec.py ./Images/mystere.csv affiche-csv
affiche le document mystere
File added
File added
File added
File added
File added
File added
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment