Coordonnées centre d'un objet complexe sur image [Résolu]

Signaler
-
Messages postés
29773
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
27 avril 2021
-
Bonjour,

J'essaye depuis deux trois jours la chose suivante:

J'ai cette image (et d'autres similaires) : https://www.cjoint.com/c/KDujuvpuVOC

Mon but est de trouver les coordonnées du centre de la croix,

Pour cela j'ai déjà réalisé plusieurs choses mais je m'en suis le mieux rapproché grâce à un système de clic sur image avec la souris avec le code suivant pour ceux que ça intéresse (grâce d'ailleurs à l'aide d'un internaute de ce forum) :

from tkinter import *
from tkinter.filedialog import * #pour les gestions de fichiers
from PIL import Image as Img
from PIL import ImageTk

#fonction permettant de définir les coordonnées
def coordonnees(event):
    xe = event.x - 200
    ye = -(event.y - 112.5)
    print("Les coordonnées du point sont x = {} et y = {}".format(xe,ye))
    

# Création d'une fenêtre d'attente de fichier
fen_princ = Tk()                                                      
monFichier = StringVar()                                              
monFichier.set("Aucun fichier sélectionné...")                       
monAffichage = Label(fen_princ, textvariable = monFichier, width=70)  
monAffichage.pack()

# Sélection de l'adresse de l'image
filename = askopenfilename(title = "Choisir une image", filetypes = [ ('jpg files','.jpg'),('all files','.*') ])

# Mise à jour de monFichier
monFichier.set(filename)

# Création d'une fenêtre avec l'image sélectionné
presentation = Img.open(filename)
presentationTk = ImageTk.PhotoImage(presentation)
labelphoto = Label(fen_princ, image = presentationTk)
labelphoto.pack()

#utilisation du clic de la souris pour avoir les coordonnées de celle-ci sur l'image
fen_princ.title("Sélection du point par clic de souris.")
fen_princ.geometry("400x225") 
fen_princ.bind('<Button-1>',coordonnees)
fen_princ.mainloop()


Or, bien que sympathique, pour le traitement de plusieurs images cela va perdre en efficacité.

D'où ma volonté de créer un code qui capte automatiquement la croix et qui calcule son centre pour enfin me données les coordonnées de celui-ci.

J'ai commencé par utiliser le code suivant, qui est complexe pour moi mais dont je commence à comprendre le principe :

import cv2
import numpy as np
from matplotlib import pyplot as plt
     
# Charger l'image en niveaux de gris et obtenir les coordonnées
img = cv2.imread('4.jpg', 0)
height, width = img.shape
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
 
images = th3
titles = "Otsu's Thresholding"
plt.imshow(images,'gray')


Il ne m'appartient pas, il s'agit d'un exercice sur un site tiers qui consistait à montrer comment utiliser le gaussianblur.

L'idéal pour moi serait de combiner l'ouverture de fenêtre et la sélection d'image de mon code précédent, d'utiliser ce code là pour transformer l'image comme ceci : https://www.cjoint.com/c/KDwhozJCgrC (on remarque d'ailleurs la complexité de la tâche car le jeu de lumière sur l'image rend une forme qui n'est pas une croix) puis en sortir les coordonnées de son centre.

Je suis débutant en Python, ce programme est un gros challenge et m'a déjà énormément appris, notamment sur le traitement d'image avec openCV.

Mais là je bloque, je pense que c'est pour l'instant au-dessus de mes compétences, je m'en remets donc à vous.

J'avais peut être une piste mais je n'arrive pas à la réaliser d'ailleurs --> créer un quadrilatère avec les 4 sommets de la croix puis calculer le centre de celui-ci.
Merci.

modération : Pour la mise en forme des sources, au dessus de la zone d'édition de tes messages, il y a des icônes pour l'enrichissement du texte. Celle qui a cet aspect
<> ▼
permet d'appliquer au code, suivant une liste de valeurs, le format correspondant à sa nature.
Un petit tuto là : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Configuration: Windows / Firefox 87.0 / Spyder Python 3.8

2 réponses

Messages postés
29773
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
27 avril 2021
7 078
Bonjour,

Tout dépend de comment on définit le centre d'un tel objet. Supposons que ce soit le barycentre du rectangle dont tu parles.

Si l'objet est blanc, continu et unique sur une surface noire, calculer il suffit sur ta matrice de pixel de déterminer xmin (resp. ymin, xmax, ymax) tel qu'au moins un pixel dans la colonne xmin (resp. la ligne ymin, resp. la colonne xmax, resp. la ligne ymax) est blanc. Le (bary)centre de ce rectangle se situe aux coordonnées ((xmin + xmax)/2, (ymin + ymax) / 2).

Si plusieurs objets sont disposés sur l'image c'est un peu plus compliqué car il faut déterminer l'ensemble des pixels appartenant à cette objet. En supposant que cet objet soit continu, et qu'au moins un pixel blanc de cet objet soit connu, il suffit, à partir de ce pixel, d'itérer sur l'ensemble des pixels de l'objet. C'est exactement ce que fait le "pot de peinture" dans paint. Pour faire il suffit de construire l'ensemble des pixels concernés, initialisé à partir du pixel connu, et étendu récursivement tel qu'à chaque fois que tu ajoutes un pixel à cet ensemble, tu ajoutes ses voisins blancs que tu n'as pas déjà visité au cours de la récursion.

Pour aller plus loin : Si tu aimes la théorie des graphes, c'est exactement équivalent à voir une matrice de pixel sous la forme d'une grille dont chaque sommet correspond à un pixel et chaque arc connecte deux sommets / pixels adjacent. Le parcours récursif dont je viens de parler revient à faire un de graphe en ignorant les arcs qui ciblent un pixel noir, en l'occurrence un BFS.

Bonne chance
Bonjour,

Merci de ta réponse, je vais étudier tout ça, j'ai réussi finalement de mon côté à avoir une coordonnées plus ou moins exact grâce à un système de reconnaissance d'objet.
Mais je vais voir si je peux être plus précis à l'aide de ta méthode.

Bonne journée
Messages postés
1042
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
27 avril 2021
112
Bonjour,

tu peux marquer cet appel comme résolu, puisque tu as eu la solution ici:

https://openclassrooms.com/forum/sujet/coordonnees-centre-dun-objet-complexe-sur-image
Messages postés
29773
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
27 avril 2021
7 078
Bonjour,

Merci pour ton retour. Je m'en occupe, mais note que pour les prochaines fois, tu peux le faire toi même,comme expliqué ici.

Bonne continuation