2015-10-11 1 views
1

J'essaie de détecter correctement les bords d'une carte à jouer qui a été floutée, nivelée puis seuillée. Je pensais qu'avoir le contraste net noir et blanc rendrait les bords assez faciles à détecter, mais pas de joie jusqu'ici. Je commence avec:Détection de bords avec image seuillée

enter image description here

Et en utilisant le détecteur Canny j'ai écrit la production de ce:

enter image description here

Le résultat de Sobel était fondamentalement la même. Cependant, l'utilisation de la détection Canny OpenCV je pouvais produire ceci:

enter image description here

La frontière étant correctement mis en place ensemble est ce que je suis désespérément besoin de recréer dans mon propre code, et je ne suis pas engagé à utiliser un type particulier de détection de bord, j'ai juste besoin de trouver un algorithme qui me donnera l'avantage connecté! My Canny code peut être trouvé here, et il est très basé sur le code LIRE here. Si quelqu'un pouvait m'aider à passer de la première image à la troisième, je serais incroyablement reconnaissant! Toute détection de bord est la bienvenue!

Edit: Code pour NMS:

//main program 
    for(int x = 1; x < width-1; x++) 
    { 
     for(int y = 1; y < height-1; y++) 
     { 
      if(src.getRaster().getPixel(x, y, tmp)[0] >= 250) 
      { 
       trackWeakOnes(x, y, src); 
      } 
     } 
    } 

    private static void trackWeakOnes(int x, int y, BufferedImage src) 
    { 
     for (int a = x - 1; a <= x + 1; a++) 
     { 
      for (int b = y - 1; b <= y + 1; b++) 
      { 
       if (checkWeak(a, b, src)) 
       { 
        src.getRaster().setPixel(x, y, tmpMax); 
        trackWeakOnes(a, b, src); 
       } 
      } 
     } 
    } 

    private static boolean checkWeak(int x, int y, BufferedImage src) 
    { 
     return ((src.getRaster().getPixel(x, y, tmpPix)[0] > 0) && 
       (src.getRaster().getPixel(x, y, tmpPix)[0] < 255)); 
    } 

tmpPix est un tableau vide à remplir, tmpMax est un tableau {255, 255, 255} pour faire des bords blancs.

+0

Je ne comprends pas le sens de votre question. Pourriez-vous clarifier ce que vous cherchez exactement? – Saeed

+0

Ecrivez ma propre détection de contours qui peut détecter les bords de la première image afin qu'elle ressemble à la troisième image, par rapport aux bords cassés du second. Celui que j'ai écrit ne détecte pas correctement la bordure de la carte. Je ne suis pas engagé à utiliser seulement Canny, je vais essayer d'autres algorithmes de détection de bord si elles fonctionnent! –

+0

Pourquoi n'utilisez-vous pas simplement OpenCV Canny si cela fonctionne? –

Répondre

1

Pour cette image propre, vous n'avez pas besoin d'algorithmes complexes. Un couple de filtres simples fera l'affaire.

En Matlab, le code ressemble à:

O=abs(filter2([-1 0 1],I))+abs(filter2([-1;0;1],I)); 

ce qui signifie que pour chaque pixel (x, y) vous:

output(x,y) = abs(I(x+1,y)-I(x-1,y)) + abs(I(x,y+1) - I(x,y-1)); 
+0

Donc juste obtenir les valeurs absolues de la différence de la valeur de pixel ci-dessus/ci-dessous et gauche/droite du pixel en question? Je vais essayer ça en une seconde. –

+0

Donc, c'était la sortie: http://imgur.com/phvWPjO? Une suggestion pour où le bricoler? –

+0

Ce n'est pas la sortie que je reçois. Vous rencontrez probablement des problèmes lorsque vous travaillez avec des pixels en tant qu'entiers non signés compris entre 0 et 255. Essayez de convertir en virgule flottante et de normaliser les pixels à 0-1, et cela devrait être meilleur. – Photon

1

Je ne l'ai pas lu votre code, mais je Observez un artefact étrange: le long des bords horizontaux, les pixels détectés sont séparés par des triplets 8 connectés. Je soupçonnerais une faille dans les logiques de suppression non maximales. (Dans tous les cas, il y a une anisotropie quelque part.)

Ceci dit, la détection de bord sur une image binaire peut être effectuée par contour tracing.

+0

Je soupçonnais la même chose étant donné que les sorties de Sobel et Canny étaient similaires. Existe-t-il un algorithme de tracé de contours particulier que vous recommanderiez? Modifier: J'ajouterai mon code pour la suppression non maximale dans la question d'origine afin que vous n'ayez pas à chercher. –

+0

Mon préféré est le balayage radial, mais tous ces algorithmes sont à peu près les mêmes. Ils nécessitent un grand soin pour les conditions de départ et de fin. Vous pourriez être intéressé par l'article connexe "Topologie numérique, Azriel Rosenfeld, The American Mathematical Monthly, Volume 86, No. 8. (Oct. 1979), pp. 621-630." Vieux, mais toujours vrai :) –

+0

Je vais jeter un coup d'oeil, merci! –