Analyse d'une image

Terence -  
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai mon premier programme à réaliser en python pour mes études, le soucis c'est que je suis vraiment nul, très nul en programmation.

Donc j'aurais aimé savoir s'il est possible d'avoir un coup de main ici.

Je vous explique le sujet, déjà on passe par jupyter notebook que j'ai installer via anaconda il me semble. Le prof nous a transmis un jeu de carte via un dossier mais le souci premièrement c'est que dès que je change la valeur de la carte (D'un 10 de trèfle je veux afficher un 10 de coeur) et ben ça ne fonctionne pas. Surement un soucis de réglages mais je ne comprends pas quoi.

Du coup, le sujet c'est qu'à partir d'une analyse de l'image, on doit savoir reconnaître qu'elle carte est affiché à l'écran. Le jeu de carte que l'on doit étudier est un jeu de carte basique sauf que l'on prend que les cartes de 1 à 10, on exclu les figures.

A partir de là, il faut être capable d'identifier:

La couleur: noire ou rouge
La forme: coeur, carreau, trèfle ou pique
Le numéro: donc de 1 à à10.



Donc selon moi il faudrait réaliser une analyse de l'image pixel par pixel avec la bibliothèque matpotlib de ce que j'ai pu trouvé sur internet.

Mon "algorithme" commencerait par quelque chose comme ça (je me répète, mais le développement j'y arrive absolument pas):

Pour "pixel" allant de 1 à "nombre de pixel total" faire:
n° pixel <- Valeur rgb (ce qui nous donnerait la liste de tous les pixels avec la couleur, donc la
couleur serait déjà trouvé)

Ensuite je pense qu'il faudrait comparer le nombre de pixels blanc par rapport au nombre de pixels noir ou rouge. Car plus il y a de la couleur sur la carte, plus le chiffre sur la carte est élevé. Mais là je n'ai aucunes approche de comment je pourrait faire. Avec cette partie on pourrait en déduire le chiffre.

Et pour la forme il faudrait, selon moi, analyser un pixel spécifique je m'explique. Sur chaque carte il y a le symbole qui est placé au même endroit sur la carte (dans les 4 coins). Donc grossièrement si on analyse une carte rouge, les pixels du coeur seront différents des pixels du carreau.

Selon vous est ce une première bonne approche ?

Je ne souhaite pas quelqu'un qui fasse le programme pour moi évidemment, mais de l'aide et une piste sur laquelle je peux m'appuyer.

J'espère avoir été clair, et je vous remercie d'avoir pris le temps de lire et de m'aider si c'est possible.

Bonne journée à vous


Configuration: Windows / Chrome 86.0.4240.75

49 réponses

georges97 Messages postés 13766 Date d'inscription   Statut Contributeur Dernière intervention   2 648
 
Non, justement, pas une liste par angle, juste un couple, constitué des deux extrêmes, la valeur la plus basse et la plus haute, correspondant à l'angle 0° du départ et de l'angle 359°. Mais mon raisonnement est sans doute faux sur la valeur du maximum de pixels, qui pourrait se trouver par exemple pour un angle de 80°.

Ce que tu pourrais faire, c'est relever les valeurs pour 0, 90, 180, 270 et 359°, soit 5 valeurs dont tu retiens le mini et le maxi, que tu utiliseras plus tard dans le dictionnaire (couple mini/maxi) dont je parlais.

Si pour chacune des 10 cartes, ces mini/maxis ne se recoupent pas, en testant l'appartenance du relevé de la carte tirée à un degré de rotation aléatoire, on pourra en déduire si elle entre dans les limites d'un couple puisque tous les couples sont différents.

Tu pourras après compléter en ajoutant l'ensemble des angles au lieu des 5 du premier test.

Par ailleurs, je ne sais pas comment tu relève les valeurs des pixels (c'est le post n°38, n-est-ce pas?), mais une simple boucle doit permettre d'établir la liste constituant le relevé des 360 positions d'angle.

Peut-être veux tu attendre la validation de Phil_1857 avant d'avancer trop loin dans ce qui pourrait ne pas convenir (je pense au dictionnaire), mais je pense que le test sur les 5 valeurs peut être tenté sans trop y consacrer de temps.

A te lire
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Hello Georges97,

Pas de problème

Donner une plage de tolérance au lieu de valeurs exactes, ca parait pas mal ...
0
georges97 Messages postés 13766 Date d'inscription   Statut Contributeur Dernière intervention   2 648
 
Bonjour Phil, et merci pour ton retour,

En me relisant, je dois préciser à l'attention de T-Rence que quand je dis: juste un couple, constitué des deux extrêmes, la valeur la plus basse et la plus haute j'entends qu'au lieu de relever 10 valeurs comme au début de votre travail, on prend la valeur min et la valeur maxi pour constituer ce couple, on n'aura donc que deux valeurs par couple pour chaque carte, certes multiplié par 360, mais de façon automatique (boucle) pour finalement donner deux valeurs pour une carte correspondant au mini/maxi du relevé de pixels.

Ce sont ces seules deux valeurs qui seront introduites pour chaque carte, constituant un dictionnaire de 10 lines. A partir de ce dictionnaire, on évaluera à quel indice (coule) correspond la nouvelle carte par comparaison avec son mini/maxi.
0
T-Rence Messages postés 57 Date d'inscription   Statut Membre Dernière intervention  
 
Ah oui donc si je comprend bien en gros je prend l'angle ou il y a le minimum de pixels, ainsi que l'angle ou il y a le maximum de pixels ce qui constitue le couple.

Ainsi si la valeur se situe dans ce couple il s'agit alors de telle carte.

Mais il faudrait faire ça pour tous les angles puisque comme vu dans l'exemple ou je cite les différences de pixels. Cela varie en fonction de chaque angle et n'est pas proportionnel (dans le sens où un angle de 10° peut avoir plus de pixels qu'un angle de 30° mais moins que celui de 20°).

Je sais pas si vous voyez ce que je veux dire ?

En tout cas s'il faut faire ça, je le ferais surement demain parce que je vous avouerais que je me suis donné la migraine.

Merci encore pour votre aide en tout cas
0
georges97 Messages postés 13766 Date d'inscription   Statut Contributeur Dernière intervention   2 648
 
je prend l'angle ou il y a le minimum de pixels, ainsi que l'angle ou il y a le maximum de pixels oui, et tu les notes pour vérifier quand tu l'auras fait pour les 10 cartes qu'il n'y a pas de recoupement (il ne devrait pas y en avoir puisque la somme de pixels à l'air différente d'une carte à l'autre)


il faudrait faire ça pour tous les angles puisque comme vu dans l'exemple ou je cite les différences de pixels.

Ne le fais pas pour le moment. Fais le pour 4 ou 5 valeurs d'angles, come je le décrivais. Le calcul des 360 angles se fera dans un second temps par une boucle (de 0 à 359)

On ne s'occupe pas de vérifier la proportionnalité? Seule l'intervalle sera pris en compte.

Je tente une illustration:

as

mini=10000
maxi-12000

2

mini=25000
maxi=28000

3

mini=28000
maxi=32000

etc.


Mon "système" ne peut fonctionner que si les valeurs de ces couples ne se recoupent jamais, sinon, il y a "bataille" entre deux cartes.

On a donc 10 couples de valeurs, qui serviront à créer un dictionnaire, sorte de liste constituée de couple de deux éléments liés l'un à l'autre. On parle d'immutabilité en python, c'est à dire sur l'on ne peut pas changer les valeurs.

Ca donnera quelque chose comme cela (je suis quasiment en mode algorithmique là, je n'ai pas vérifié la syntaxe.

Je crée donc un dictionnaire mini_maxi pour les 10 cartes

dico_minmax={"mini1": 10000, "maxi1": 12000,"mini2": 25000, "maxi2": 28000,"mini3": 28000, "maxi3": 32000,....}

Chaque couple dans le dictionnaire ext un indice de 0 à 9 donc.

Une fonction if sera utilisée our comparer la carte entée, quelque soit son orientation, puisqu'elle devrait se situer dans l'intervalle d'un des 10 couples.

Par exemple, si la valeur de la carte entrée est de 26000 pour un angle de 30°, c'est le 2, si c'est 27500, c"est aussi le 2.

Si c'est 310000, c'est le 3.

En fait, on ne se préoccupe plus de l'angle, qui a été traité en amont, ou plus exactement contourné puisqu'on a enregistré dans une liste les 360 valeurs que peut prendre une carte et qu'on n'en a extrait le min et le maxi grâce aux fonctions min() et max()

La dernière partie consistera à tester par un if à quel couple correspond la a valeur-pixels de la carte entrée. Pour cela , on teste tour à tour chaque couple du dictionnaire jusqu'à atteindre l'intervalle correspondant à la valeur recherchée.


A l'attention de Phil, si cela n'est pas possible par le dictionnaire, c'est sans doute envisageable sur une liste et peut-être plus simple puisqu'il suffira de s'arrêter quand on atteindra la valeur recherchée:

ma_liste_valeurs(10000,12000;25000,28000,32000) et le if ressemblera à quelque chose comme:
for carte_entrée in range ma_liste_valeurs:
if carte_entrée<indice_liste:
carte_sortie=valeur(indice_liste) soit la carte 3 pour l'indice 2

Je suis à la retraite et dispose de temps mais le concours de Phil sera indispensable pour la dernière partie car je ne suis qu'un junior en python (mais pas en âge) et si ma piste est correcte, il aura sans doute des idées d'amélioration.

A bientôt.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
georges97 Messages postés 13766 Date d'inscription   Statut Contributeur Dernière intervention   2 648
 
Au fait Phil, nous n'avons pas de nouvelles de Phil et surtout de son programme.

"Mort aux pluches" comme on disait de notre temps ou passé à C pluche pluche et nous ayant laissé avec son ex-problème?
0
T-Rence Messages postés 57 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour à tous,

Désolé pour le délai de réponse, j'ai eu quelques soucis perso qui fait que j'ai baissé pas mal les bras.

Je tiens à m'excuser auprès des personnes qui ont pris du temps pour me répondre et pour m'aider.

Je vous remercie grandement de l'aide que vous avez pu m'apporter. J'ai un peu evolué grâce à vous meme si mon niveau en code reste presque null.

Pour info j'ai toujours pas la solution de ce problème, mais le prof m'avait parlé qu'avec un réseau de neuronnes c'était totalement faisable mais il l'a dit lui même que pour nous c'était quasi impossible. Il a surtout souligné les démarches de recherches qui ont été effectué par chacun.

Je sais pas si vous vous y connaissez en réseau de neuronnes mais sachez qu'avec ce genre de système cela est faisable.

Si jamais vous avez des questions sur le sujet je pourrais faire l'intermédiaire pour y répondre.

Encore une fois, merci à vous pour votre aide.
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Bonjour t-rence,

Les réseaux de neurones, je connais, j'ai déjà fait un programme qui, après une phase

d'apprentissage, reconnait ou bien des lettres, ou bien des chiffres sur une grille de 5x5 pixels ...
0
georges97 Messages postés 13766 Date d'inscription   Statut Contributeur Dernière intervention   2 648
 
Bonjour T-rence,

Merci pour ce retour. J'imaginais bien que vous aviez du mal à compléter ce programme, qui n'est effectivement pas d'un niveau débutant.

Je connaissais le principe du réseau de neurones, qui sert entre autres choses dans le domaine de l'Intelligence Artificielle, dont notamment l'identification d'un individu dans une foule ou la détection des comportements déviants (les chinois sont très avancés dans ces spécialités) entre autres choses nécessitant un apprentissage par mix algorithmes-analyse de données.

Pour ma part, j'ai parmi mes nombreux projets, celui d'une ruche connectée où la reconnaissance de formes serait utilisée pour le comptage des abeilles et la détection de leurs migrations hors de la ruche (carte raspberry pi). Je n'ai pas le niveau pour écrire ce genre de programme in extenso mais plusieurs existent déjà, qui utilisent des bibliothèques de python (il me semble qu'il y en a une chez Google).

Je constate que votre professeur a apprécié vos efforts pour résoudre l'exercice, ce qui vous aura fait progresser, ce qui est le but de toute pédagogie. Comme le disait Coubertin, "l'important...")

Je vous souhaite bonne continuation dans vos études et le reste.

Georges
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Bonjour t-rence,

Je pense que tu peux marquer cet appel comme résolu ........
0