2017-05-31 65 views
1

我有一个2d numpy数组,它有0的地方有不是的一个对象,而1的地方有是一个对象。Alpha屏蔽非正方形区域python cv2

matrix.shape = (500, 425)

我想创建形状(500, 425, 3)的numpy的阵列面具这样的:

mask = np.zeros((500, 425, 3)) 
if matrix[x][y] == 0: 
    mask[x][y] = np.array([0, 0, 0]) # Black pixel if no object 
else: 
    mask[x][y] = np.array([0, 255, 0]) # Green pixel if object 

所以我有绿色像素,其中对象是,黑色像素其他任何地方。我如何创建这个面具?这是否会正常工作,如果我使用cv2.addWeighted图像和面具,对象将有一个透明的绿色面具在它上面?

回答

2

你所描述的“上”或“混合”图像合成操作。您可以结合使用,直接你的面具形象。通式图像的两个图像以这种方式结合是:

A*alpha + B*(1-alpha) 

当A被放置在图像B.阿尔法顶部的图像可以是黑色之间的任意值和白色。灰色的alpha值会使A看起来透明。通常情况下,转换为浮点图像会更容易,因为当数值介于0和1之间时,数学变得更容易。

如果您有图像A(您的源图像)和图像B(绿色图像)以及蒙版(矩阵)。您可以使用图像A的顶部覆盖图像B:

outimg[x][y] = (B[x][y] * matrix[x][y]) + (A[x][y] * (1-matrix[x][y])) 

,或者如果你想透明度:

#50% transparency 
t = 0.5 
outimg[x][y] = (B[x][y] * (matrix[x][y]*t)) + (A[x][y] * (1-(matrix[x][y]*t))) 

如果你想要把图像A图像B的顶部,你可以只是反转条件在表达中。

这里是用掩模和透明度使图像B(源图像)的顶合成图像A(平坦绿色图像)的一个例子:

源图像:

lena

掩模图像:

lena_mask

import numpy as np 
import cv2 

i = cv2.imread('lena.bmp') 
#convert to floating point 
img = np.array(i, dtype=np.float) 
img /= 255.0 
cv2.imshow('img',img) 
cv2.waitKey(0) 

j = cv2.imread('lena_mask.bmp') 
#convert to floating point 
mask = np.array(j, dtype=np.float) 
mask /= 255.0 
#set transparency to 25% 
transparency = .25 
mask*=transparency 
cv2.imshow('img',mask) 
cv2.waitKey(0) 

#make a green overlay 
green = np.ones(img.shape, dtype=np.float)*(0,1,0) 

#green over original image 
out = green*mask + img*(1.0-mask) 
cv2.imshow('img',out) 
cv2.waitKey(0) 

cv2.destroyAllWindows() 

输出图像:

output

+0

大的例子。谢谢。 – SetSlapShot

1

一个简单的方法是用broadcasting延伸matrix3D并简单地用绿色三联相乘,像这样经过 -

matrix[...,None]*[0,255,0] 

采样运行 -

In [35]: matrix 
Out[35]: 
array([[1, 0, 0, 0], 
     [1, 0, 0, 1], 
     [0, 0, 1, 0]]) 

In [36]: matrix[...,None]*[0,255,0] 
Out[36]: 
array([[[ 0, 255, 0], 
     [ 0, 0, 0], 
     [ 0, 0, 0], 
     [ 0, 0, 0]], 

     [[ 0, 255, 0], 
     [ 0, 0, 0], 
     [ 0, 0, 0], 
     [ 0, 255, 0]], 

     [[ 0, 0, 0], 
     [ 0, 0, 0], 
     [ 0, 255, 0], 
     [ 0, 0, 0]]]) 

第二列标志着绿色。

请注意,这不是alpha遮罩,通常涉及第四个通道,但是是一个简单的RGB遮罩。

基于initialization并可能在更好的性能与零的另一种方法 -

m,n = matrix.shape 
out = np.zeros((m,n,3),dtype=np.uint8) 
out[matrix==1,1] = 255 # green channel accessed with the last index being 1