web-dev-qa-db-fra.com

expliquer les arguments signifiant dans res = cv2.bitwise_and (img, img, mask = mask)

J'essaie d'extraire la couleur bleue d'une image d'entrée. Pour cela, je crée une frontière de couleur HSV bleue et une image HSV de seuil en utilisant la commande

mask_img = cv2.inRange(hsv, lower_blue, upper_blue)

Après cela, j'ai utilisé un bitwise_and sur l'image d'entrée et l'image de seuil en utilisant

res = cv2.bitwise_and(img,img,mask = mask_img)

Où "img" est l'image d'entrée. Ce code que j'ai obtenu de l'opencv. Mais je ne comprenais pas pourquoi trois arguments utilisés dans bitwise_and et que signifient en fait chaque argument? Pourquoi la même image est utilisée à src1 et src2?

Et aussi à quoi sert le mot-clé mask ici? Aidez-moi à trouver la réponse

14
SACHIN

Le concept de base derrière cela est la valeur de la couleur noire, sa valeur est 0 dans OPEN_CV.So black + anycolor = anycolor car la valeur du noir est 0.

Supposons maintenant que nous ayons deux images dont une est nommée img1 et l'autre est img2. img2 contient un logo que nous voulons placer sur l'img1. Nous créons threshold puis les mask et mask_inv d'img2, et également créer roi d'img1. Maintenant, nous devons faire deux choses pour ajouter le logo d'img2 sur img1. Nous créons un arrière-plan de roi comme img1_bg avec l'aide de: mask_inv, mask_inv aura deux régions, une noire et une blanche, dans la région blanche, nous mettrons img1 et laisserons le noir tel quel-

img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)

Dans votre question, vous avez utilisé directement le masque de l'img créé

res = cv2.bitwise_and(img,img,mask = mask_img)

et dans img2, nous devons créer le logo comme premier plan du roi,

img2_fg = cv2.bitwise_and(img2,img2,mask = mask)

ici, nous avons utilisé la couche de masque, la partie logo de img2 est remplie dans la partie blanche du masque Maintenant, lorsque nous ajoutons les deux, nous obtenons un ROI combiné parfait Pour une description complète et une visite de compréhension: OUVRIR LES FICHIERS DE CODE CV ET LA DESCRIPTION COMPLÈTE

8
Animesh Srivastava

L'opération "Et" ne sera effectuée que si mask [i] n'est pas égal à zéro, sinon le résultat de et l'opération sera nul. Le masque doit être une image blanche ou noire avec un seul canal. vous pouvez voir ce lien http://docs.opencv.org/2.4.13.2/modules/core/doc/operations_on_arrays.html?highlight=bitwise#bitwise-and

6
Mohammed Awney

D'après les réponses ci-dessus, nous pouvons connaître les définitions des paramètres de bitwise_and (), mais ils ne répondent pas tous à l'autre question

Pourquoi la même image est utilisée à src1 et src2?

Cette question doit être causée par la définition de fonction trop simplifiée dans le document d'OpenCV, elle peut être ambiguë pour certaines personnes, dans le document le bitwise_and () est défini comme

dst (I) = sur1 (I) ^ sur2 (I), si mask (I)! = 0, où ^ représente l'opérateur 'et'

à partir de cette définition, à première vue, je ne peux pas comprendre comment traiter le dst (I) lorsque le masque (I) est à 0.

D'après le résultat du test, je pense qu'il devrait donner une définition de fonction plus claire comme

dst (I) = sur1 (I) ^ sur2 (I), si mask (I)! = 0,

sinon, le dst (I) conserve sa valeur d'origine et la valeur par défaut de tous les éléments du tableau dst est 0.

Maintenant, nous pouvons savoir qu'en utilisant la même image pour sur1 et sur2, elle ne gardera que les parties de l'image d'origine dans la zone du masque (I)! = 0 et l'autre zone montre la partie de l'image dst (comme la forme du masque)

De plus, pour les autres opérations au niveau du bit, les définitions doivent être les mêmes que ci-dessus, elles doivent également ajouter la condition sinon et la description de la valeur par défaut du tableau dst

4
phchen2

que signifie réellement chaque argument? res = cv2.bitwise_and(img,img,mask = mask_img)

src1: la première image (le premier objet pour la fusion) src2: la deuxième image (le deuxième objet pour la fusion) masque: compris comme des règles à fusionner. Si la région de l'image (qui est mise à l'échelle en gris, puis masquée) a une couleur noire (évaluée à 0), elle n'est pas combinée (fusion de la région de la première image avec celle de la seconde). Inversement, elle sera réalisée. Dans votre code, l'image référencée est "mask_img". Dans mon cas, mon code est correct quand il fait du blanc + anycolor = anycolor; import cv2 import numpy as np

# Load two images
img1 = cv2.imread('bongSung.jpg')
img2 = cv2.imread('opencv.jpg')

# I want to put logo on top-left corner, so I create a ROI 
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]

# NOw we need to create a mask of the logo, mask is conversion to grayscale of an image
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) 
ret, mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('mask', mask)

mask_inv = cv2.bitwise_not(mask)
#cv2.imshow("mask_inv", mask_inv)

#When using bitwise_and() in opencv with python then white + anycolor = anycolor; black + anycolor = black 
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
#cv2.imshow("img1_bg", img1_bg)

cv2.imshow("img2", img2)

img2_fg = cv2.bitwise_and(img2,img2,mask = mask)
cv2.imshow('img2_fg', img2_fg)

dst = cv2.add(img1_bg,img2_fg)

img1[0:rows, 0:cols] = dst

#cv2.imshow("Image", img1)
cv2.waitKey(0)

cv2.destroyAllWindows()
3
Huynh Nguyen

Le lien ci-dessous explique clairement le fonctionnement au niveau du bit et également la signification de chaque paramètre. http://opencvexamples.blogspot.com/2013/10/bitwise-and-or-xor-and-not.html

void bitwise_and (InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray ())

Calcule la conjonction bit par élément de deux tableaux ou d'un tableau et d'un scalaire. Paramètres: src1 - premier tableau d'entrée ou scalaire.

src2 - deuxième tableau d'entrée ou un scalaire.

src - tableau à entrée unique.

valeur - valeur scalaire.

dst - tableau de sortie qui a la même taille et le même type que les tableaux d'entrée. mask - masque d'opération facultatif, tableau monocanal 8 bits, qui spécifie les éléments du tableau de sortie à modifier

2
shri

En ce qui concerne l'utilisation d'img deux fois, je suppose que nous ne nous soucions pas vraiment de ce qu'est img [i] et img [i], car c'est juste img [i] pour le binaire. Ce qui importe, c'est que, comme l'a mentionné Mohammed Awney, lorsque le masque est 0, nous faisons img [i] être 0, sinon nous laissons le pixel tranquille. C'est un moyen de rendre certains pixels en noir img, selon notre masque.

1
Cartesian Theater