python cv2从蒙皮遮罩3d阵列图像中弹出黑色

python cv2从蒙皮遮罩3d阵列图像中弹出黑色,python,arrays,mask,cv2,skin,Python,Arrays,Mask,Cv2,Skin,从面部图像中,我得到了一张带有cv2的皮肤面膜 结果是由像素(RGB)组成的数组(图像)数组 问题是在结果图片中有太多不属于皮肤的黑色像素 我想得到二维阵列,非黑色像素为[[218195182]..[229,0133]]-仅面部肤色像素 我试图通过查找所有RGB都等于0的像素来弹出黑色像素,就像[0,0,0]一样 请注意,我不想从[255,0125][0,0255]等像素中提取零。 def弹出黑色(皮肤): 列表=[] #皮肤图像的像素循环 对于范围内的i(皮肤形状[0]): 对于范围内的j(

从面部图像中,我得到了一张带有cv2的皮肤面膜

结果是由像素(RGB)组成的数组(图像)数组

问题是在结果图片中有太多不属于皮肤的黑色像素

我想得到二维阵列,非黑色像素为[[218195182]..[229,0133]]-仅面部肤色像素

我试图通过查找所有RGB都等于0的像素来弹出黑色像素,就像[0,0,0]一样

请注意,我不想从[255,0125][0,0255]等像素中提取零。

def弹出黑色(皮肤):
列表=[]
#皮肤图像的像素循环
对于范围内的i(皮肤形状[0]):
对于范围内的j(蒙皮形状[1]):
如果(非(皮肤[i][j][0]==0和皮肤[i][j][1]==0和皮肤[i][j][2]==0)):
#仅向列表中添加非黑色像素
列表.附加(皮肤[i][j])
返回列表
如何以更高效、更快速的方式编写


谢谢

如果值为零,则它们基本上不会对矩阵乘法中的图像产生影响。但是如果你想显示没有黑色像素的图像,你可以添加一个alpha蒙版并使这些像素透明

def make_transparent(img):
    tmp = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    _,alpha = cv2.threshold(tmp,0,255,cv2.THRESH_BINARY)
    b, g, r = cv2.split(img)
    rgba = [b,g,r, alpha]
    dst = cv2.merge(rgba,4)
    return dst

编辑:如果要查找非黑色像素,可以使用numpy的
nonzero
方法

desired_pixels = img[img.nonzero()]
我用另一种方式问了这个问题,得到了很好的答案


祝你好运

我不想让这些像素透明,我想得到非黑色像素的数组我试着
desired_pixels=img[img.nonzero()]
现在我得到了错误:`预期的2D数组,取而代之的是1D数组:数组=[218.195.182…229.178.133.]`。我希望二维数组为:[[218.195.182]…[229.178.133]。而不是像[125,25,0]那样从像素中过滤零。只过滤[0,0,0]零像素扫描你能帮我吗??