假设我这里有一张灰度图像:
和这里的二进制掩码图像:
具有相同的尺寸和形状。我如何生成类似这样的东西:
其中由二进制掩码中的1指示的值是实值,并且掩码中为0的值在最终图像中为空。
发布于 2019-12-21 00:15:43
使用cv2.bitwise_and
使用二进制蒙版对图像进行蒙版。蒙版上的任何白色像素(值为1)将被保留,而黑色像素(值为0)将被忽略。下面是一个例子:
输入图像(左)、遮罩(右)
屏蔽后的结果
代码
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()
发布于 2019-12-21 01:13:04
以下是使用Python Opencv的另外两种方法。第一个类似于@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)
这两种方法的结果是相同的:
发布于 2020-11-13 19:03:52
其他的答案对我都不起作用。那时候,我花了很多时间来寻找一个好的掩蔽函数。以下是仅使用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.]]])
https://stackoverflow.com/questions/59432324
复制