简体   繁体   English

如何用二进制掩码掩码图像

[英]How to mask image with binary mask

Suppose I have a greyscale image here:假设我在这里有一个灰度图像: 在此处输入图片说明

And a binary masked image here:和这里的二进制蒙版图像: 在此处输入图片说明

With the same dimensions and shape.具有相同的尺寸和形状。 How do I generate something like this:我如何生成这样的东西: 在此处输入图片说明

Where the values indicated by the 1 in the binary mask are the real values, and values that are 0 in the mask are null in the final image.其中二进制掩码中 1 表示的值是真实值,掩码中为 0 的值在最终图像中为空。

Use cv2.bitwise_and to mask an image with a binary mask.使用cv2.bitwise_and用二进制掩码掩码图像。 Any white pixels on the mask (values with 1) will be kept while black pixels (value with 0) will be ignored.蒙版上的任何白色像素(值为 1)将被保留,而黑色像素(值为 0)将被忽略。 Here's a example:下面是一个例子:

Input image (left), Mask (right)输入图像(左),蒙版(右)

Result after masking屏蔽后的结果

Code代码

import cv2
import numpy as np

# Load image, create mask, and draw white circle on mask
image = cv2.imread('1.jpeg')
mask = np.zeros(image.shape, dtype=np.uint8)
mask = cv2.circle(mask, (260, 300), 225, (255,255,255), -1) 

# Mask input image with binary mask
result = cv2.bitwise_and(image, mask)
# Color background white
result[mask==0] = 255 # Optional

cv2.imshow('image', image)
cv2.imshow('mask', mask)
cv2.imshow('result', result)
cv2.waitKey()

Here are two other ways using Python Opencv.这是使用 Python Opencv 的另外两种方法。 The first is similar to that of @nathancy.第一个类似于@nathancy。 The second uses multiplication to do the masking.第二个使用乘法来进行屏蔽。 I use the same images as provided by @nathancy:我使用与@nathancy 提供的相同的图像:

在此处输入图片说明

在此处输入图片说明

import cv2
import numpy as np

# read image
img = cv2.imread('pink_flower.png')

#mask it - method 1:
# read mask as grayscale in range 0 to 255
mask1 = cv2.imread('pink_flower_mask.png',0)
result1 = img.copy()
result1[mask1 == 0] = 0
result1[mask1 != 0] = img[mask1 != 0]

# mask it - method 2:
# read mask normally, but divide by 255.0, so range is 0 to 1 as float
mask2 = cv2.imread('pink_flower_mask.png') / 255.0
# mask by multiplication, clip to range 0 to 255 and make integer
result2 = (img * mask2).clip(0, 255).astype(np.uint8)

cv2.imshow('image', img)
cv2.imshow('mask1', mask1)
cv2.imshow('masked image1', result1)
cv2.imshow('masked image2', result2)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('pink_flower_masked1.png', result1)
cv2.imwrite('pink_flower_masked2.png', result2)


Results are the same for both methods:两种方法的结果相同:

在此处输入图片说明

The other answers did not work for me.其他答案对我不起作用。 Back then, I spent so much time to find a good masking function.当时,我花了很多时间来寻找一个好的掩蔽功能。 Here are two simple answers with numpy only.这是仅使用 numpy 的两个简单答案。

import numpy as np

arr = np.arange(27).reshape(3,3,3) #3 channel image
mask = np.zeros(shape=(3,3))
mask[1,1] = 1 # binary mask
mask_3d = np.stack((mask,mask,mask),axis=0) #3 channel mask

## Answer 1
# Simply multiply the image array with the mask

masked_arr = arr*mask_3d

## Answer 2
# Use the where function in numpy

masked_arr = np.where(mask_3d==1,arr,mask_3d)

#Both answer gives
print(masked_arr)

array([[[ 0.,  0.,  0.],
        [ 0.,  4.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0., 13.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0., 22.,  0.],
        [ 0.,  0.,  0.]]])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM