leg de betekenis van argumenten uit in res = cv2.bitwise_and(img,img,mask = mask)

Ik probeer de blauwe kleur van een invoerafbeelding te extraheren. Daarvoor maak ik een blauwe HSV-kleurgrens en HSV-drempelafbeelding met behulp van het commando

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

Daarna gebruikte ik een bitwise_andop de invoerafbeelding en de drempelafbeelding met behulp van

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

Waarbij imgde invoerafbeelding is. Ik heb deze code van opencv. Maar ik begreep niet waarom er drie argumenten worden gebruikt in bitwise_anden wat elk argument eigenlijk betekent? Waarom wordt dezelfde afbeelding gebruikt bij src1 en src2 ?

En wat is hier het gebruik van het maskzoekwoord? Help me alsjeblieft om het antwoord te vinden


Antwoord 1, autoriteit 100%

Het basisconcept hierachter is de waarde van de kleur zwart, de waarde is 0 in OPEN_CV. Dus zwart + anycolor= anycolor omdat de waarde van zwart 0 is.

Stel nu dat we twee afbeeldingen hebben, de ene heet img1en de andere is img2.
img2 bevat een logo dat we op de img1 willen plaatsen. We maken thresholden dan het masken mask_invvan img2, en maken ook roivan img1.
Nu moeten we twee dingen doen om het logo van img2 op img1 toe te voegen.
We maken een achtergrond van roi als img1_bg met behulp van: mask_inv, mask_inv zal twee regio’s hebben, een zwarte en een witte, in de witte regio zullen we het img1-gedeelte plaatsen en zwart laten zoals het is-

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

In je vraag heb je direct het masker van de gemaakte img gebruikt

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

en in img2 moeten we het logo maken als voorgrond van roi ,

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

hier hebben we mask layer gebruikt, het logogedeelte van img2 wordt ingevuld in het witte gedeelte van mask
Als we nu beide toevoegen, krijgen we een perfecte gecombineerde roi
Ga voor een volledige beschrijving en begrip naar:
OPEN CV-CODEBESTANDEN EN VOLLEDIGE BESCHRIJVING


Antwoord 2, autoriteit 86%

De bewerking “And” wordt alleen uitgevoerd als mask[i] niet gelijk is aan nul, anders is het resultaat van en bewerking nul. Het masker moet een witte of zwarte afbeelding zijn met een enkel kanaal. je kunt deze link zien
http://docs.opencv .org/2.4.13.2/modules/core/doc/operations_on_arrays.html?highlight=bitwise#bitwise-and


Antwoord 3, autoriteit 64%

wat betekent elk argument eigenlijk?
res = cv2.bitwise_and(img,img,mask = mask_img)

src1: de eerste afbeelding (het eerste object om samen te voegen)

src2: de tweede afbeelding (het tweede object om samen te voegen)

masker: begrepen als regels om samen te voegen. Als het gebied van de afbeelding (die grijs is geschaald en vervolgens gemaskeerd) een zwarte kleur heeft (gewaardeerd als 0), dan wordt het niet gecombineerd (het gebied van de eerste afbeelding samenvoegen met dat van de tweede), vice versa, zal het voerde uit. In uw code is de afbeelding waarnaar wordt verwezen “mask_img”.

In mijn geval is mijn code correct, als deze wit + anycolor = anycolor maakt

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()

Antwoord 4, autoriteit 43%

Van de bovenstaande antwoorden kennen we misschien de definities van de parameters van bitwise_and(), maar ze beantwoorden niet allemaal de andere vraag

Waarom wordt dezelfde afbeelding gebruikt bij src1 en src2 ?

Deze vraag zou moeten worden veroorzaakt door de te vereenvoudigde functiedefinitie in het document van OpenCV, het kan voor sommige mensen dubbelzinnig zijn, in het document wordt bitwise_and() gedefinieerd als

DST (I) = sur1 (i) ^ sur2 (i), als masker (I)! = 0, waarbij ^ de ‘en’ operator

vertegenwoordigt

Vanaf deze definitie op het eerste gezicht kan ik de foto niet krijgen over het verwerken van de DST (I) wanneer het masker (I) 0 is.

Van het testresultaat denk ik dat het een duidelijkere functie-definitie moet geven als

DST (I) = sur1 (i) ^ sur2 (i), als masker (I)! = 0,

Anders houden de DST (I) de oorspronkelijke waarde en de standaardwaarde van alle elementen van de DST-array 0.

Nu kunnen we weten dat het gebruik van hetzelfde beeld voor SUR1 en SUR2, het alleen de originele beeldonderdelen op het gebied van masker (I) (I) zal houden! = 0 en het andere gebied toont het deel van het DST-beeld (zoals de Maskervorm)

Bovendien moeten de definities voor andere bitwise-operaties hetzelfde zijn als hierboven, ze moeten ook de anderswaarde toevoegen en de standaardwaarde Beschrijving van de DST-array


Antwoord 5, Autoriteit 7%

De onderstaande link legt duidelijk de bitwise-operatie uit en ook de betekenis van elke parameters.
http://oppenencvexamples.blogspot.com/2013 /10/bitwise-and–xor-and-not.html

Void BitWise_and (InputArray SRC1, Inputarray SRC2, OutputArray DST, Inputarray Mask = Noarray ())

Berekent de bit-wijze conjunctie per element van twee arrays of een array en een scalaire.
Parameters:
SRC1 – eerste ingangsarray of een scalaire.

SRC2 – tweede ingangsarray of een scalaire.

SRC – Single Input Array.

Waarde – Scalaire waarde.

DST – Uitgangsarray met dezelfde grootte en type als de ingangsarrays.
MASKER – Optioneel bedieningsmasker, 8-bits enkelvoudige array, die elementen van de uitgangsarray aangeeft die moet worden gewijzigd


Antwoord 6, Autoriteit 7%

Wat betreft het twee keer gebruiken van img, denk ik dat het ons niet echt kan schelen wat img[i] en img[i] is, omdat het gewoon img[i] is voor binair. Waar het om gaat is dat, zoals Mohammed Awney zei, als het masker 0 is, we img[i] 0 maken, anders laten we de pixel met rust. Dit is een manier om bepaalde pixels in img zwart te maken, volgens ons masker.


Antwoord 7

bitwise_and ( InputArray src1,
InputArray src2,
OutputArray dst,
InputArray-masker = noArray()
)

src1 eerste invoerarray of een scalair.

src2 tweede invoerarray of een scalair.

dst uitvoerarray die dezelfde grootte en hetzelfde type heeft als de invoerarrays.

masker optioneel operatiemasker, 8-bit enkelkanaals array, dat specificeert dat elementen van de uitvoerarray moeten worden gewijzigd.

dst(I)=src1(I)∧src2(I)if mask(I)≠0

en masker werken op dst

berekent bitsgewijze conjunctie van de twee arrays (dst = src1 & src2) Berekent de bitsgewijze conjunctie per element van twee arrays of een array en een scalaire waarde.

Other episodes