L'équivalent de copyTo en Python OpenCV liaisons?
OpenCV a la copyTo fonction, qui permet de copier une zone masquée d'un Tapis à l'autre.
http://docs.opencv.org/3.1.0/d3/d63/classcv_1_1Mat.html#a4331fa88593a9a9c14c0998574695ebb
Ce qui est l'équivalent de ce dans les bindings Python? Je voudrais copier une zone d'une image à une autre image, avec un masque binaire.
Vous devez vous connecter pour publier un commentaire.
cv::Mat::copyTo
effectue l'une des deux choses, selon que la matrice de sortie a été initialisé. Si votre matrice de sortie n'est pas initialisé, à l'aide decopyTo
avec un masque crée une nouvelle matrice de sortie qui est du même type que l'entrée et toutes les valeurs sont fixées à 0 sur tous les canaux. Une fois que cela arrive, les données de l'image est définie par le masque est copié avec le reste de la matrice être mis à 0. Si votre matrice de sortie est initialisé et déjà se compose de contenu,copyTo
copie les pixels qui sont définis dans le masque de la source et laisse les pixels qui ne faisaient pas partie de l'entourage d'être intact dans la destination. Par conséquent, un remplacement de pixels qui sont définies par le masque de l'image source est copié à la sortie.Parce que OpenCV utilise maintenant
numpy
à l'interface avec la bibliothèque, il est très facile de faire les deux méthodes. À différencier de l'autre réponse vu dans ce post, la première méthode peut être réalisé simplement en multipliant le masque avec l'image dans un élément-sage de la mode. En supposant que votre entrée est appeléimg
et votre masque binaire est appelémask
où je suis en supposant que le masque est en 2D, il suffit de faire ce qui suit:Le code ci-dessus mais suppose que les deux
img
etmask
partager le même nombre de canaux. Ce qui est difficile si vous utilisez une couleur à l'image de la source et le masque 2D comme je l'ai déjà supposé. Par conséquent, le nombre total de canaux 2 et pas 3, et donc la syntaxe ci-dessus vous donnera une erreur que les dimensions entre les deux ne sont plus compatibles. Vous aurez besoin afin de prendre en compte lorsque vous utilisez des images couleur. Vous pouvez le faire en ajoutant un singleton troisième dimension pour le masque, de sorte que la diffusion peut être mis à profit.Pour la deuxième approche, nous supposons que nous avons une autre image appelée
other_image
où vous souhaitez copier le contenu dans cette image définie par votre masque de retour à l'image de la cibleimg
. Dans ce cas, ce que vous voulez faire en premier est de déterminer toutes les endroits dans le masque, qui sont non-zéro à l'aide denumpy.où
, puis les utiliser pour d'index ou de les couper en tranches de votre image ainsi que l'endroit où vous souhaitez copier à partir de. Nous devons également être conscients du nombre de canaux entre les deux images, tout comme avec la première approche:Voici un exemple de fonctionnement pour les deux approches. Je vais utiliser le Caméraman de l'image c'est un test standard de l'image perçue dans la plupart des algorithmes de traitement d'image.
J'ai aussi artificiellement les couleurs de l'image, même si c'est visualisé comme en niveaux de gris, mais les intensités seront copiés sur tous les canaux. J'ai aussi l'intention de définir un masque qui est tout simplement le haut à gauche 100 x 100 sous-région et nous allons donc créer une image de sortie des copies de cette sous-région:
Lorsque vous utilisez la première méthode, et quand nous le montrent les résultats, nous obtenons:
Nous pouvons voir que nous avons créé une image de sortie où le haut à gauche 100 x 100 sous-région contient nos données d'image avec le reste des pixels égale à 0. Ceci est soumis à l'entourage des endroits qui sont mis à
True
. Pour la deuxième approche, nous allons créer l'autre image à la une qui est aléatoire de la même taille que l'image d'entrée qui s'étend de[0, 255]
pour tous les canaux.Une fois que nous courons à travers le code avec la deuxième approche, j'ai cette image:
Comme vous pouvez le voir, le coin supérieur gauche de l'image a été mis à jour, que le masque des endroits qui sont mis à
True
.cv.CopyTo
, mais il semble que la mise en œuvre que le premier cas (destination obtient initalized avec des zéros). @LBerger: ne devrait-il pas la deuxième approche (de l'heure d'été est déjà initialisé) être considéré comme trop dans votre RP?copyTo
n'. Le PR ne pas mettre en œuvre la solution complète.Remarque assurez-vous si c'est exactement ce que vous voulez, mais pour la copie avec des masques en Python, je voudrais aller avec
cv2.bitwise_
cv::Mat::copyTo
n'zéro les pixels qui n'appartiennent pas à l'entourage, donc c'est correct. Je vais laisser ma réponse ci-dessus dans le cas de l'OP veut copier les pixels qui ne sont pas touchés par le masque.