IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

générer une liste de rectangle à partir d'une liste de points


Sujet :

C#

  1. #1
    Membre habitué

    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Février 2013
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 148
    Points : 199
    Points
    199
    Par défaut générer une liste de rectangle à partir d'une liste de points
    Bonjour à tous,

    Je suis bloqué sur un algo qui ce révèle pas évident...
    J'ai une liste de points qui correspondent aux valeurs max d'une image.
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public IEnumerable<Point> DetectedPoints { get; private set; }
    Si j'affiche ces points dans un bitmap, ça correspond aux zones rouges:

    Nom : Capture d'écran 2024-03-18 145532.png
Affichages : 79
Taille : 15,2 Ko

    J'aimerais récupérer une liste de Rectangles (l'objet défini par sa position et sa taille de System.Drawing) qui encadre les zones les plus denses de points (avec un paramétrage de densité) pour les afficher dans ma vue en WPF sur l'image.
    J'ai tenté une méthode, mais qui je pense est une impasse et un "bouffe ressources"...

    Dans une méthode je boucle sur tous mes points:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                    List<Rectangle> _zonesRects = new List<Rectangle>();
                    foreach (var point in DetectedPoints)
                    {
                        var rectangle = ComputePoint(DetectedPoints, point);
     
                        if (rectangle != null)
                            _zonesRects.Add((Rectangle)rectangle);
                    }
     
                    _onDetectionRectanglesComputed?.Invoke(_zonesRects);


    Et je recherche des zones:

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     private List<Rectangle> _zoneDetected = new List<Rectangle>();
     private Rectangle? ComputePoint(IEnumerable<Point> detectionPoints, Point originPoint, int minSize = 6)
     {
         foreach (var zoneDetected in _zoneDetected)
           if (zoneDetected.Contains(originPoint))
                 return null;
     
         int rectHeight = int.MaxValue;
         int xDelta = 0;
     
         while (true)
         {
             int yDelta = 0;
     
             bool processYLine = true;
     
             while (processYLine)
             {
                 bool pointExist = detectionPoints.Any(point => point.X == originPoint.X + xDelta && point.Y == originPoint.Y + yDelta);
     
                 if(!pointExist && yDelta >= minSize && yDelta < rectHeight)
                 {
                     rectHeight = yDelta+1;
                 }
                 if (!pointExist && yDelta < minSize && xDelta < minSize)
                 {
                     return null;
                 }
                 else if(!pointExist && yDelta >= minSize && xDelta >= minSize)
                 {
                     var rect = new Rectangle(originPoint.X, originPoint.Y, xDelta+1, rectHeight);
                     _zoneDetected.Add(rect);
     
                     return rect;
                 }
     
                 processYLine = pointExist;
     
                 yDelta++;
             }
     
             xDelta++;
         }
     }

    Mais ça ne fonctionne pas, et c'est pour moi une impasse...

    J'espère être clair, si certains peuvent m'aiguiller c'est super !

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 187
    Points : 1 731
    Points
    1 731
    Par défaut
    Tu pourrais nous indiquer ce que tu voudrais approximativement en résultat final à partir de ton image?

    Je procéderai peut-être en comparant les distances entre les points et conservant les x/y min et max pour déterminer mon rectangle ensuite

  3. #3
    Membre habitué

    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Février 2013
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 148
    Points : 199
    Points
    199
    Par défaut
    Merci umfred

    Le but est d'afficher des rectangles entourant les zones de points les plus denses

    Nom : Sans titre-1.jpg
Affichages : 58
Taille : 41,1 Ko

    Il faut pour ça des critères de largeur min, longueur min et de densité. Pas évident ...

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 187
    Points : 1 731
    Points
    1 731
    Par défaut
    Je ne dis pas que c'est une bonne solution (ni simple), mais avec mon raisonnement précédent, on obtient un rectangle d'une certaine taille, donc on pourrait lui appliquer les critères de largeur/longueur, puis si ok, compter le nombre de points présents pour établir et vérifier le critère de densité ?
    Et ensuite passer au point suivant hors de ce rectangle (dans tous les cas)

  5. #5
    Membre habitué

    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Février 2013
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 148
    Points : 199
    Points
    199
    Par défaut
    C'est une idée...Je vais tenter ce que je peux, merci à toi
    Je te tiens au courant !

  6. #6
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 645
    Points : 2 165
    Points
    2 165
    Par défaut
    Hello,

    Je pense qu'il doit avoir un algo bien précis pour ce genre de problème mais perso de but en blanc je ferai comme ça :

    Je diviserais ça par cellule. D'abord des grosses pour repérer grosso-modo les convergences. Ensuite additionner les cellules prometteuses (au cas ou l'algo a tranché dans un nuage de points). Et refaire la même chose, avec une taille moindre, etc ... Ainsi affiner les points et ne travailler que là ou on sait qu'il y a de la densité. En plus il y aurai une notion d'affinage donc possiblement encore + de contrôle.

Discussions similaires

  1. Créer une image à partir d'une liste de points
    Par binome-x dans le forum Traitement d'images
    Réponses: 7
    Dernier message: 19/02/2016, 10h01
  2. Définir des contours à partir d'une liste de points
    Par Masmeta dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 03/04/2014, 09h24
  3. Réponses: 0
    Dernier message: 14/03/2014, 23h20
  4. Calcul d'un volume à partir d'une serie de liste de points
    Par gwal21 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 09/06/2011, 19h30
  5. Trouver equation à partir d'une liste de points
    Par scarabee dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 27/05/2004, 17h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo