python cv2 从 skin-mask 3d 阵列图像中弹出黑色

python cv2 eject black color from skin-mask 3d array image

从人脸图像中,我得到了一个带有 cv2 的图像蒙版,正如我发现的 here

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

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

我想得到非黑色像素的二维数组 [[218,195,182]。 ... [229,0, 133]] - 只有面部肤色的像素

我尝试通过查找所有 RGB 等于 0 的所有像素来弹出黑色像素 仅像 [0,0,0]:

请注意,我不想从以下像素中提取零:[255,0,125] [0,0,255] 等等。

        def eject_black_color(skin):
            list=[]
            #loop over pixels of skin-image
            for i in range(skin.shape[0]):
                for j in range(skin.shape[1]):
                    if(not (skin[i][j][0]==0 and skin[i][j][1]==0 and skin[i][j][2]==0)):
                        #add only non-black pixels to list
                        list.append(skin[i][j])
            return list

如何编写更高效快捷?

谢谢

如果这些值为零,则它们基本上不会影响矩阵乘法中的图像。但是如果你想显示没有黑色像素的图像,你可以添加一个 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()]

我以不同的方式问了这个问题,得到了很好的答案。

祝你好运!