web-dev-qa-db-fra.com

Modèle OPENCV correspondant et transparence

Qu'est-ce que la façon dont OpenCV gère la transparence dans l'image pendant la correspondance des modèles?

Le problème est que l'image du modèle doit avoir des pièces transparentes, car dans l'image d'origine, il pourrait y avoir n'importe quoi à ces endroits.

J'ai essayé toutes les méthodes et aucun d'entre eux n'a donné des résultats positifs (par exemple, la position de modèle dans l'image d'origine n'a pas été détectée correctement).

31
mnn

Il ne semble pas que OpenCV gère Alpha comme vous le souhaitez.

Vous avez deux options:

  1. Écrivez votre propre méthode de corrélation croisée qui utilisera le canal alpha
  2. Transformez vos images pour que votre canal alpha devienne sans importance

Depuis la première option est simple, je vais explorer la deuxième option ici. Je vais réutiliser le code exemple que j'ai fourni à ne question similaire plus tôt. Si vous appliquez une corrélation croisée directement sur vos images, l'arrière-plan interfère avec la correspondance de gabarit (en particulier, des pièces de fond clair). Si vous jouez avec des canaux de couleur, vous constaterez que la correspondance dans le canal bleu donne le résultat correct. Cela dépend du contenu de l'image et n'est pas un moyen cohérent de résoudre le problème.

Une autre option consiste à effectuer la détection des bords (par exemple SOBEL ) sur l'image et le modèle et effectuez une corrélation croisée alors. Voici les images détectées par le bord (j'ai utilisé le détecteur de bord de sobel sur le canal Luma dans GIMP, puis quelques étirements d'intensité).

map

building

Comme vous pouvez le constater, le canal alpha est devenu non pertinent, car la plupart des terrains sont devenus une intensité nulle et ne contribueront pas au calcul de la corrélation croisée. Alors maintenant, la corrélation croisée peut être directement appliquée, ce qui donne le résultat souhaité:

misha@misha-desktop:~/Desktop/stackoverflow$ python cross-correlation.py map-blue.png building-maskz-blue.png 
(163, 244)

Enfin, voici ne autre question connexe .

Ps. Quel jeu est-ce?

18
mpenkov

J'ai une solution légèrement plus morte à ce sujet qui semble bien fonctionner de manière raisonnable: remplacez le canal alpha de l'image du modèle avec le bruit, ce qui rend plus ou moins les régions transparentes insignifiantes de manière statistique pendant le processus de correspondance.

Par exemple, mon cas d'utilisation impliquait la recherche de caractères Emoji dans les captures d'écran de iOS. L'arrière-plan du clavier iOS change de couleurs en fonction du contexte, ce qui rend le processus de correspondance problématique si vous vous engagez à une couleur d'arrière-plan particulière dans votre image de modèle.

Voici l'image de modèle brut sur Alpha:
raw template image on alpha

Voici le modèle traité avec le bruit de remplissage de bruit pour le canal alpha:
enter image description here

J'ai envoyé l'image de modèle traitée via le code d'échantillon de correspondance de modèle fourni dans la documentation OpenCV. Sur fond sombre ou léger, le match est trouvé avec une confiance raisonnable.

Recherche sur des arrière-plans sombres:

matched on dark

Recherche sur des arrière-plans lumineux:

matched on light

En comparaison, laissant le canal alpha de la gabarit transparent - ou commettant un fond sombre ou léger - n'a pas renvoyé des matchs acceptables.

10
kitschpatrol

OpenCV 3.0 offre un support natif pour la correspondance de modèle avec des modèles masqués. Reportez-vous à la nouvelle documentation :

Paramètres:

image ...

templ ...

résultat ...

méthode ...

masque Masque de modèle recherché. Il doit avoir le même type de données et la taille avec templ. Il n'est pas réglé par défaut.

[Digression]

Notez que la correspondance de modèle avec des images de référence masquées (l'image agrandie) n'est pas possible cependant. Et ça fait du sens, des utilisations OpenCV données correspondant modèle FFT basé.

Par conséquent, si vous devez effectuer seule la correspondance de modèle à des régions spécifiques de vos images de référence, vous devrez implémenter votre propre méthode pour cela ou masquer la sortie de cv :: matchTemplate.

Sa mise en œuvre à partir de zéro devrait compenser les cas où vous ne souhaitez que pour rechercher le modèle dans des régions très spécifiques (i.e. .: coins harris).

9
Marcello Salomao

Les SQDIFF/SQDIFF_N Option serait une solution si vous avez essayé de remplacer le canal alpha avec la couleur RVB noire. Au moins, c'était ma solution au même problème. De mon résultat, il est évident que cette méthode est sensible aux valeurs de pixels plus brillantes et j'ai eu la possibilité de cela.

1
Marstep