cv2asker
cv2asker

Reputation: 43

opencv python copy mask region (black or white pixels) onto a BGR image region

In OpenCV python, say we read an image with cv2.imread and get a BGR numpy array. We next generate a mask with the cv2.inRange command. The mask has the same width/height and each mask pixel is either black or white.

I want to copy a region from the mask (taken as an image of black and white pixels) onto a region of the color image.

How do I do that? This does not work

img[10:20,10:20] = mask[10:20,10:20]

Must I convert the mask to BGR image first? If so how?

Edit: I do not want to apply the whole mask to the image as in apply mask to color image. Another way to say what I want: see the mask as a black and white image. I want to copy a region of that image (as a set of black or white pixels) onto another image. The resulting image will be a color image except for one smaller rectangular region that contains only black or white pixels. The result will be similar to if I in photoshop copy a rectangular area of a black/white image and past that rectangle onto an area of a color image.

(I'm new to OpenCV)

Upvotes: 4

Views: 5259

Answers (1)

Håken Lid
Håken Lid

Reputation: 23064

If you try to do it with a single channel (grayscale) mask directly, the shapes of the array slices will not be the same, and the operation will fail.

>>> img[10:20,10:20] = mask[10:20,10:20]

ValueError: could not broadcast input array from shape (10,10) into shape (10,10,3)

You have to convert the mask to BGR, which will make it 3 channels, like the original image.

>>> bgr_mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
>>> img[10:20,10:20] = bgr_mask[10:20,10:20]

Upvotes: 0

Related Questions