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

Traitement d'images Discussion :

regrouper une série de points selons certaines règles.


Sujet :

Traitement d'images

  1. #1
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut regrouper une série de points selons certaines règles.
    Bonjour,

    J'ai une vidéo de mauvaise qualité dont les lignes de chaque images sont aléatoirement décalées. J'essaie, à l'aide d'un algorithme personnalisé, d'aligner ces lignes. Le principe est simple:
    Pour chaque ligne, je dois détecter où elle commence et en déduire sa position. La difficulté est de détecter le début (ou la fin) d'une ligne. Quand l'image est sombre la détection est mauvaise. Comme j'ai le choix entre le bord gauche et le bord droit de ma vidéo pour détecter le début ou la fin d'un ligne, je me propose d'utiliser le meilleur bord (le plus lumineux) pour cette détection. Cependant, je ne veux pas choisir ligne par ligne le côté mais traiter des blocs d'une largeur minimum. Voici un exemple:
    En bleu les pixels qui sont plus lumineux à droite qu'à gauche.



    Ici il faudrait donc traiter deux blocs:
    - en dessus de la flèche verte, on prendra le bord gauche pour détecter le début des lignes,
    - en dessous de la flèche verte, on prendra le bord droit pour détecter la fin des lignes

    Par défaut, la détection se fait sur le bord gauche, qui est de meilleure qualité. Voici les règles que je me fixe pour créer un bloc sur lequel la détection se fera sur le bord droit:

    - Un bloc doit avoir une largeur minimum (disons 50px)
    - Deux blocs sur le bords droits doivent être séparer d'un distance minimum (disons aussi 50px)
    - Un bloc doit évidement contenir beaucoup plus de pixel bleu que de pixel rouge
    - La dernière difficulté (pour laquelle je n'ai pas encore trouver de règle satisfaisante) est de bien déterminer les extrémités des blocs (c'est à dire avoir une densité de pixel bleu satisfaisante).

    Auriez vous une idée d'algorithme pour créer ces blocs? Je sens qu'il me manque quelques outils mathématique pour "mesurer" la densité de mes pixel bleus.

    Merci d'avance pour vos idées.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    J'avoue que je n'ai pas tout compris. Mais si votre problème consiste à "délimiter une zone bleue", j'ai fait un petit traitement dont le but est de rechercher, à partir d'un pixel, que l'on peut considérer comme "ancien centre", le pixel qui serai le "nouveau centre". C'est à dire que à partir de deux images successives de la même chose, à un très faible dépacement près, on peut calculer le déplacement d'un point.
    Ce n'est pas le même but que pour vous, mais à mon avis la méthode est la même.

  3. #3
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Ca m'intéresses, peux-tu m'en dire plus sur ton algorithme? D'autant plus que les blocs contenant mes pixels bleus ne doivent pas changer trop d'une image à l'autre.
    Je sais que mon explication n'est pas très claire... pourrais-tu m'indiquer ce que tu ne comprends pas?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Voila le source.
    Sauf la classe Graphics::TBitmap qui est une classe de Borland Builder, ça devrait être tout à fait standard.
    J'ai beaucoup travaille avec des images.
    A suivre, ce sujet m'intéresse.
    Fichiers attachés Fichiers attachés

  5. #5
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Merci pour le code, mais cela ne correspond en fait pas à mon problème.
    Je vais essayer de le reformuler en essayant d'être plus clair.

    J'essaie de corriger les time base errors (ou décalage aléatoire des lignes) d'une vidéo. Voici ce que ça donne:

    avant correction:


    après correction:


    Afin de pouvoir aligner les lignes, je dois détecter où chacune d'elle commence (ou termine). Quand l'image est lumineuse, les bord gauches et droits de la vidéo sont assez nets et il est donc assez facile de détecter les extrémités des lignes. Quand la vidéo est plus sombre, les limites sont beaucoup plus floues, il est donc difficile de savoir ou les lignes commence réellement et la correction est forcément moins bonne. Un exemple ici (il faudra éventuellement zoomer pour bien observer les bords droits et gauches):



    On voit que le bord droit est, à luminosité égale, plus abimé que le bord gauche (pour les 80 premier pixels en partant du haut). En revanche la partie en bas, plus lumineuse, est bien meilleure à droite qu'à gauche.
    Je voudrais donc aligner mes lignes en me servant du bord gauche pour les 80 premiers pixels et de bord droit pour les 160 pixels du bas.

    Tout le problème est de bien définir les parties (bord gauche ou bord droit à utiliser). Dans mon premier post, j'ai appelé ces parties "blocs".
    J'ai commencé, pour chaque ligne, à établir quel est le bord le plus pertinent (en bleu quand c'est le bord droit dans l'image de mon premier post). Cependant je veux limiter le nombre de blocs. Il me faut donc regrouper mes pixels bleu et respecter les règles suivantes:

    - Un bloc doit avoir une largeur minimum à gauche et à droite (disons 50px)
    - Les blocs ne doivent pas trop bouger d'une image à l'autre de ma vidéo.

    En espérant avoir été plus clair cette fois-ci...

    Merci beaucoup de m'aider. J'ai vraiment besoin d'un pro sur ce coup là

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Pourquoi ne pas utiliser les 2 bords en meme temps ?

  7. #7
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Pourquoi ne pas utiliser les 2 bords en meme temps ?
    J'avais déjà essayer de déduire la largeur des lignes en me servant des 2 côtés, mais cette méthode semble moins bien marcher car le côté droit est la plupart du temps en trop mauvais état. Mais si tu as une idée de comment faire, ça m'intéresse beaucoup.

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par maa Voir le message
    quel intérêt?
    avoir deux sources d'information sur le décalage possible, au lieu d'une seule.

    Et comment?
    et bien de la meme manière que pour un seul bord. En cherchant le maximum de vraisemblance du décalage. Non ? C'est pas comme cela que tu fais ?

  9. #9
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    j'ai édité mon message pendant ta réponse

    et bien de la meme manière que pour un seul bord. En cherchant le maximum de vraisemblance du décalage. Non ? C'est pas comme cela que tu fais ?
    Ca pourrait être pas mal, mais en tenant compte plus d'un côté que de l'autre selon la luminosité...

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par maa Voir le message
    J'avais déjà essayer de déduire la largeur des lignes en me servant des 2 côtés, mais cette méthode semble moins bien marcher car le côté droit est la plupart du temps en trop mauvais état. Mais si tu as une idée de comment faire, ça m'intéresse beaucoup.
    La largeur des lignes ?
    Moi je parlais juste de trouver l'offset de décalage pour chaque ligne, pas sa largeur.

    Pour chaque ligne :
    - Pour chaque pixel dans le bord gauche, on calcule la probabilité qu'il soit le début de l'image
    - Pour chaque pixel dans le bord droit, on calcule la probabilité qu'il soit la fin de l'image
    - On prend le pixel ayant la plus forte proba, et on en déduit l'offset de décalage

  11. #11
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Comment calcules-tu cette probabilité?

    Le bord droit est tellement mauvais que l'extrémité de la ligne est quasiment impossible à trouver. On pourrait à la limite la deviner à 3 ou 4 pixels près... ce qui pourrait être une information intéressante si on connait la largeur des lignes. Je me suis d'ailleurs mal exprimé tout à l'heure. Je parlais plutôt de me servir de ces informations pour trouver l'offset de décalage:
    - de la largeur des lignes
    - d'une série de pixels à gauche affectés la probabilité qu'il soit le début de l'image
    - d'une série de pixels à droite affectés la probabilité qu'il soit le fin de l'image

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par maa Voir le message
    Comment calcules-tu cette probabilité?
    Ah, c'est tout le problème.

    On peut se servir des informations spatiales, temporelles ou les 2. Je ne sais pas trop ce qui se fait dans l'état de l'art, ni ce que toi tu as comme contraintes. Il faut se documenter.

    Pour les infos spatiales, je dirais qu'il y a l'étude "horizontale" de la luminosité des pixels avant/après l'offset potentiel étudié. Pour la proba sur le bande gauche, on peut imaginer un truc du genre :

    Proba(offset) = ( count(x<offset et f(x)<seuil) + count(x>offset et f(x)>seuil) ) / LargeurBande

    Meme genre pour la bande de droite. Puis ponderer les probas par la dynamique sur la bande, pour pénaliser les zones a faible contraste... etc.

    Et puis il y a aussi l'étude "verticale" de la corrélation entre 2 lignes successives.

    Je jette un peu des idées en vrac, il faut faire le tri.

  13. #13
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    ok... dans la théorie ça parait beau mais dans la pratique je doute que j'arrive à tenir compte de tout avec des probabilités pertinentes...
    Je vais y réfléchir encore mais il me semble que j'obtiendrais de meilleur résultats en travaillant sur un seul bord à la fois.
    Comment ferais-tu pour constituer les blocs comme j'ai expliqué dans mon message ci-dessus?

  14. #14
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par maa Voir le message
    Comment ferais-tu pour constituer les blocs comme j'ai expliqué dans mon message ci-dessus?
    Si j'ai bien compris, à chaque ligne est associée une valeur binaire suivant que le meilleur bord est à gauche ou à droite. Et tu cherches a regrouper les lignes en "paquets" homogènes (dans l'espace vertical, et dans le temps)

    As-tu essayé un filtrage median sur ces valeurs binaires ?

  15. #15
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Si j'ai bien compris, à chaque ligne est associée une valeur binaire suivant que le meilleur bord est à gauche ou à droite. Et tu cherches a regrouper les lignes en "paquets" homogènes (dans l'espace vertical, et dans le temps)
    oui exactement

    Citation Envoyé par pseudocode Voir le message
    As-tu essayé un filtrage median sur ces valeurs binaires ?
    Ce pourrait en effet me servir pour déterminer les extrémités de mes paquets. Il faudrait alors prendre un fenêtre centré sur le pixel étudié et qui prends en compte n pixels au dessus, n pixel en dessous sur l'image concernée et sur les n images précédentes et les n suivantes (pour ne pas que les paquets bougent trop d'une image à l'autre).

    Cependant comment faire pour n'avoir que des paquets d'une largeur supérieur à 50px ?

  16. #16
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par maa Voir le message
    Cependant comment faire pour n'avoir que des paquets d'une largeur supérieur à 50px ?
    ca doit se regler avec des filtres morpho-math classiques : ouverture, fermeture, rolling ball, ...

  17. #17
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    ca doit se regler avec des filtres morpho-math classiques : ouverture, fermeture, rolling ball, ...
    Peux-tu m'en dire un peu plus? Je ne connais pas ces filtres...

  18. #18
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par maa Voir le message
    Peux-tu m'en dire un peu plus? Je ne connais pas ces filtres...
    Heu, non. Je ne peux pas résumer la morpho-math en quelques lignes dans un message.

    Le plus simple c'est d'aller consulter les liens externes cités dans wikipedia (en particulier celui de Jean Serra).

    L'idée c'est de boucher les trous dans ta séquence binaire, afin d'obtenir des blocs contigus de 50px minimum

  19. #19
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Désolé de répondre si tard, je voulais trouver le temps de bien regarder la la morpho-math avant de poster.
    En fait je m'aperçois que le sujet est assez large et je ne vois pas trop comment les opérations de dilatation, érosion, ouverture ou fermeture peuvent m'aider pour mon problème.
    Le problème est qu'il faut déterminer avec précision les extrémités sans les dilater ni les rogner, combler les trous à l'intérieur et ne garder que des segments d'une longueur supérieur à 50px. Ce qui ne nous fais trois actions différentes qu'une seule opération ne saurait à priori gérer... je me trompe?

  20. #20
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Hum... pas simple effectivement. Par exemple si tu as de courtes séquences alternées 001011011010... c'est du de faire des blocs de 50px.

    Peut-être un filtrage par hystérésis permettrait de déterminer les "gros" blocs contigus. Pour les pixels restants, il faut les raccrocher à l'un des 2 blocs adjacents. Je ne sais pas trop comment se distribuent les données.

Discussions similaires

  1. [VBA-E] Changement de couleur d'un point d'une série dans un graphique ?
    Par epfyffer dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/02/2020, 11h59
  2. Équation linéaire d'une série de points
    Par sdecorme dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 17/09/2014, 19h29
  3. Réponses: 22
    Dernier message: 22/10/2012, 21h53
  4. Tirage d'une série de points dans une Image
    Par maryoumatwo dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 25/03/2011, 10h37
  5. VBA, graphiques : Acceder au Range pointé par une série
    Par CCHEVALIER dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/09/2005, 10h56

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