2010-08-04 20 views
1

I téléchargé une image par exemple pour une meilleure compréhension: http://www.imagebanana.com/view/kaja46ko/test.jpgOpenCV: détecter un dégradé de noir vers blanc dans une zone

Dans l'image que vous pouvez voir quelques lignes de balayage et un marqueur (le retangle blanc avec le cercle en elle). Je veux qu'OpenCV longe une zone spécifiée (dans l'exemple décrit par les lignes de balayage) qui devrait être autour de 5x5. Si cette zone contient un dégradé du noir au blanc, je veux qu'OpenCV enregistre la position de cette zone, afin que je puisse travailler avec elle plus tard. Le résultat final serait de faire la différence entre le marqueur et les autres retangles séparés par des lignes noires et blanches.

Est-ce que quelque chose comme ça est possible? J'ai beaucoup googlé mais j'ai seulement trouvé des détecteurs de bord mais ce n'est pas ce que je veux, j'ai vraiment besoin de la détection du dégradé noir à blanc uniquement.

Merci d'avance.

Répondre

1

Merci pour votre répondeur dnul, mais cela ne m'a pas vraiment aidé à résoudre ce problème. Je pensais à propos d'un histogramme pour aborder le problème mais ce n'est pas tout à fait ce que je veux.

J'ai résolu ce problème en créant une matrice 40x40 qui contient 5x5 matrices contenant les données de pixels brutes dans les 3 canaux. J'ai parcouru chaque zone de 40px et à l'intérieur de chaque bande de 5px. J'ai vérifié chaque pixel et enregistré ceux qui sont plus sombres qu'un certain seuil de stockage.

Après l'itération, j'ai eu une idée approximative du nombre de pixels noirs, donc j'ai vérifié chacun d'entre eux pour les voisins avec des pixels blancs dans les 3 canaux. J'ai ensuite marqué chacun de ces pixels et les ai enregistrés dans un autre stockage. J'ai ensuite utilisé l'algorithme ransac pour construire des lignes à partir de ces points. Il construit environ 5-20 lignes par arête de marqueur. J'ai ensuite regardé les lignes qui se rencontrent et sauvé la position de celles qui se rencontrent dans un angle carré. Les 4 points que je reçois sont les bords du marqueur.

Si vous souhaitez reproduire ceci, vous devez préalablement filtrer l'image et appliquer un seuil pour faciliter la distinction entre les pixels noirs et blancs.

Une image de l'échantillon, enregistrez après avoir trouvé les points, et avant de construire les lignes: http://www.imagebanana.com/view/i6gfe6qi/9.jpg

2

ce serait une bonne idée de filtrer certaines des zones en calculant leur histogramme. Vous pouvez utiliser cvCalcHist pour la tâche, puis vous pouvez définir un seuil pour déterminer si le pourcentage de pixels noir et blanc correspond à celui d'un dégradé. Cela ne résoudra pas la tâche mais vous aidera à réduire la complexité.

Ensuite, vous pouvez éroder l'image pour fusionner toutes les zones blanches. Après avoir appliqué le seuil, il serait possible de trouver des composants connectés (en utilisant cvFindContours) qui sépareront les images dans les zones noires ou les zones blanches. Vous pouvez ensuite détecter les dégradés en trouvant 5x5 zones qui contiennent à la fois une partie d'une zone blanche et une zone noire simultanément.

espérons que ça aide.