2016-05-16 2 views
2

Bonjour à tous et merci Je suis étudiante et j'écris un code C++ pour mon projet final. Mon problème de code est avec Edge Detection algorithme (traitement d'images), alors que je suis en cours d'exécution Edge Detection algorithme dans MATLAB I obtient une bonne détection de bord, mais si je courais le code de l'algorithme écrit en C++, l'image créée est avec une mauvaise détection.Détection de contours - mauvaise détection

J'ai essayé de détecter le bord avec Matlb en utilisant un seuil de 0,03 et la détection était super (les changements dans mon projet est très faible (peu de changements sur la surface blanche).

Merci beaucoup Idan.

peut-être quelqu'un peut me aider, voici mon code:.

void ApplySobelFilter(unsigned char src[][NUMBER_OF_COLUMNS], float Threshold) 
{ 
    unsigned char dst[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS]; 
    unsigned char * ptrToImage; 
    ptrToImage = dst[0]; 
    // Kernels for sobel operator 
    int Kernel_X[3][3] = { { -1, 0, 1 },{ -2, 0, 2 },{ -1, 0, 1 } }; 
    int Kernel_Y[3][3] = { { 1, 2, 1 },{ 0, 0, 0 },{ -1, -2, -1 } }; 
    // clears destination image 
    for (int pixel = 0; pixel < NUMBER_OF_ROWS*NUMBER_OF_COLUMNS; pixel++) 
     *ptrToImage++ = 0; 

    for (int row = 1; row < NUMBER_OF_ROWS - 1; row++) 
     for (int column = 1; column < NUMBER_OF_COLUMNS - 1; column++) 
     { 

      double Gtot = 0; 
      int Gx = 0; 
      int Gy = 0; 

      for (int x = -1; x <= 1; x++) 
       for (int y = -1; y <= 1; y++) 
       { 
        Gx += src[row + y][column + x] * Kernel_X[y + 1][x + 1]; 
        Gy += src[row + y][column + x] * Kernel_Y[y + 1][x + 1]; 

       } 

      Gtot = sqrt(double(Gx^2 + Gy^2)); 

      if (Gtot >= Threshold) 
       dst[row][column] = 255; 

      else 
       dst[row][column] = 0; 

     } 

    for (int row = 0; row < NUMBER_OF_ROWS; row++) 
    { 
     for (int col = 0; col < NUMBER_OF_COLUMNS; col++) 
     { 
      src[row][col] = dst[row][col]; 
     } 
    } 
} 
+1

salut Idan, bienvenue à débordement bloqué! Connaissez-vous la bibliothèque OpenCV? c'est une bibliothèque C++ avec des capacités de traitement d'image. Il contient également la fonction Sobel. Pour plus d'informations: http://opencv.org/ – drorco

+1

Pouvez-vous poster des images (attendues et résultats)? Ou, au moins des liens vers eux? –

+0

Une autre chose, votre image est une image grise? –

Répondre

2
Gtot = sqrt(double(Gx^2 + Gy^2)); 

C'est fait sans doute pas ce que vous attendez L'opérateur ^ calcule xor bit-wise, pas de puissance. Dans votre cas, il retourne simplement le deuxième bit de Gx et Gy. La quadrature des variables peut être effectuée par ex. comme ceci:

Gtot = sqrt(double(Gx * Gx + Gy * Gy)); 
+0

merci, j'ai changé le code, mais il reste avec une très mauvaise détection des contours – idan

+0

Si vous utilisez 0.03 comme seuil, cela pourrait être faux. Dans Matlab, les images ont souvent une plage à virgule flottante dans [0,1], alors que vous semblez avoir une plage d'entiers dans [0,255]. Je pense que le seuil correspondant pour votre cas serait d'environ 8. – matz

+0

merci, mais ça ne marche toujours pas ... peut-être connaissez-vous d'autres très bon code de détection de bord? – idan