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

  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