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++Builder Discussion :

Detection de contours d'une image


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 109
    Par défaut Detection de contours d'une image
    Bonsoir,
    Je veut réaliser une application en Builder pour detecter les contours des objets dans une image, aidez moi pour réaliser cette application.
    Je suis en attente de votre suggestions,
    et merci d'avance.

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Salut voici un liens qui pourrait t'aider:
    http://www.developpez.net/forums/d68...ction-contour/

    PS: J'ai jamais tester OpenCV sous C++Builder

    Encore des liens
    En français:
    http://fr.wikipedia.org/wiki/Algorithme_de_Canny
    En anglais (plus complet):
    http://en.wikipedia.org/wiki/Canny_edge_detector

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Par défaut
    le mieux c'est d'utliser opencv comme te l'a signalé crayon.

    ou d'appliquer des filtre dérivateur (canny, laplace,...) en gros chaque pixel de ton image sera multiplié par la matrice de définition des ces filtre.

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 109
    Par défaut
    Merci pour les liens,
    Je suis intéressé à réaliser un des filtres, est ce qu'il y a un code exemple pour que je puisse inspirer depuis ce code, en builder ou delphi et merci

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 109
    Par défaut
    Salut,
    j'ai fait un grand effort mais je peux pas appliquer le filtre PREWITT sur une image couleur ou noir et blanc, la seule chose que j'ai pu programmer c'est le flou uniform (matrice (1,1,1),(1,1,1),(1,1,1)), mon pb c comment appliquer ces deux matrices
    M1=(-1,0,1)
    (-1,0,1)
    (-1,0,1)

    M1=(-1,-1,-1)
    ( 0, 0, 0)
    ( 1, 1, 1)

    et sommer les résultats obtenus avec les 2 noyaux (M1 et M2)

    Voici mon code de flou uniform, SVP corriger moi pour faire PREWITT et merci

    Code : 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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    void BlurBitmap(Graphics::TBitmap* ABitmap) {
     
        assert(ABitmap != NULL);
        ABitmap->PixelFormat = pf24bit;
     
        const float h[3][3] =
            {{1, 1, 1},
             {1, 1, 1},
             {1, 1, 1}};
     
        const int width = ABitmap->Width;
        const int height = ABitmap->Height;
     
        for (int y = 1; y < height - 1; ++y) {
     
            RGBTRIPLE* line_prev =
                static_cast<RGBTRIPLE*>(ABitmap->ScanLine[y - 1]);
            RGBTRIPLE* line_curr =
                static_cast<RGBTRIPLE*>(ABitmap->ScanLine[y]);
            RGBTRIPLE* line_next =
                static_cast<RGBTRIPLE*>(ABitmap->ScanLine[y + 1]);
     
            for (int x = 1; x < width - 1; ++x) {
     
                float blue =
                    (h[0][0] * static_cast<float>(line_prev[x - 1].rgbtBlue)) +
                    (h[0][1] * static_cast<float>(line_prev[x].rgbtBlue)) +
                    (h[0][2] * static_cast<float>(line_prev[x + 1].rgbtBlue)) +
                    (h[1][0] * static_cast<float>(line_curr[x - 1].rgbtBlue)) +
                    (h[1][1] * static_cast<float>(line_curr[x].rgbtBlue)) +
                    (h[1][2] * static_cast<float>(line_curr[x + 1].rgbtBlue)) +
                    (h[2][0] * static_cast<float>(line_next[x - 1].rgbtBlue)) +
                    (h[2][1] * static_cast<float>(line_next[x].rgbtBlue)) +
                    (h[2][2] * static_cast<float>(line_next[x + 1].rgbtBlue));
     
                float green =
                    (h[0][0] * static_cast<float>(line_prev[x - 1].rgbtGreen)) +
                    (h[0][1] * static_cast<float>(line_prev[x].rgbtGreen)) +
                    (h[0][2] * static_cast<float>(line_prev[x + 1].rgbtGreen)) +
                    (h[1][0] * static_cast<float>(line_curr[x - 1].rgbtGreen)) +
                    (h[1][1] * static_cast<float>(line_curr[x].rgbtGreen)) +
                    (h[1][2] * static_cast<float>(line_curr[x + 1].rgbtGreen)) +
                    (h[2][0] * static_cast<float>(line_next[x - 1].rgbtGreen)) +
                    (h[2][1] * static_cast<float>(line_next[x].rgbtGreen)) +
                    (h[2][2] * static_cast<float>(line_next[x + 1].rgbtGreen));
     
                float red =
                    (h[0][0] * static_cast<float>(line_prev[x - 1].rgbtRed)) +
                    (h[0][1] * static_cast<float>(line_prev[x].rgbtRed)) +
                    (h[0][2] * static_cast<float>(line_prev[x + 1].rgbtRed)) +
                    (h[1][0] * static_cast<float>(line_curr[x - 1].rgbtRed)) +
                    (h[1][1] * static_cast<float>(line_curr[x].rgbtRed)) +
                    (h[1][2] * static_cast<float>(line_curr[x + 1].rgbtRed)) +
                    (h[2][0] * static_cast<float>(line_next[x - 1].rgbtRed)) +
                    (h[2][1] * static_cast<float>(line_next[x].rgbtRed)) +
                    (h[2][2] * static_cast<float>(line_next[x + 1].rgbtRed));
     
                blue = blue / 9; // 1 * 9
                green = green / 9; // 1 * 9
                red = red / 9; // 1 * 9
     
                line_curr[x].rgbtBlue = FIX0(CLIP255(blue));
                line_curr[x].rgbtGreen = FIX0(CLIP255(green));
                line_curr[x].rgbtRed = FIX0(CLIP255(red));
            }
        }
    }

  6. #6
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    salut,

    la méthode est bien expliquée dans ce lien

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    La détection des contours se fait avec un filtre passe-haut.

    Tu trouveras plus d'explications sur cette page:
    http://fr.wikipedia.org/wiki/Traitem...on_de_contours

    Et une approche plus pratique sur le filtre de Canny:
    1) Faire un premier filtrage pour éliminer les valeurs trop locales (matrice h)
    2) Appliquer le filtre passe-haut (matrices Gx et Gy)
    3) Faire un second filtre de seuillage pour éliminer les artefacts

  8. #8
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Salut, voici une fonction pour un filtre passe haut pour niveau de gris. Le code reste à vérifier il a été écris il y a plusieurs années
    Code : 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
    void HighPass(Graphics::TBitmap *ImAModifier)
    {
    int y, x, i, j, sum=0;
    int PixelValue;
    int Mask[3][3] = {{-1, -1, -1,}, {-1, 8, -1}, {-1, -1, -1}};
    Graphics::TBitmap *ImTemp = new Graphics::TBitmap;
     
    ImTemp->Assign(ImAModifier);
     
    for (y=1; y<=ImAModifier->Height-1; y++)
      for (x=1; x<=ImAModifier->Width-1; x++){
     
        /* Application du masque */
        for (j=-1; j<=1; j++)
          for (i=-1; i<=1; i++){
            PixelValue = ((ImTemp->Canvas->Pixels[x+i][y+j]) & 0x0000FF);
            sum += PixelValue * Mask[i+1][j+1];
          }
     
        sum = sum/9.0;
        sum = (sum << 16) | (sum << 8) | sum;
        ImAModifier->Canvas->Pixels[x][y] = (TColor) sum;
        sum=0;
      }
    }

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 109
    Par défaut
    Merci, pour tous ça, finalement j'ai trouvé l'erreur : j'ai utilisé un seul bitmap pour l'image source et destination!!!

    Mais c'est quoi un filtre de seuillage ?

Discussions similaires

  1. Réponses: 0
    Dernier message: 08/04/2009, 18h37
  2. texte qui suit le contour d'une image
    Par Rocket666 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 07/02/2006, 11h45
  3. contour d'une image
    Par duga dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 23/09/2005, 14h45
  4. mettre une couleur au contour d'une image
    Par totoranky dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 07/12/2004, 14h37

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