【问题标题】:python cv2 eject black color from skin-mask 3d array imagepython cv2从皮肤蒙版3d数组图像中弹出黑色
【发布时间】:2020-11-22 17:15:04
【问题描述】:

从面部图像中,我得到了一个带有 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

如何写更高效快捷?

谢谢

【问题讨论】:

    标签: python arrays mask cv2 skin


    【解决方案1】:

    如果这些值为零,则它们在矩阵乘法中基本上不会影响您的图像。但是,如果您想显示没有黑色像素的图像,您可以添加一个 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()] 现在我得到错误:` 预期的二维数组,而不是一维数组:array=[218. 195. 182. ... 229. 178. 133.]`。我想要二维数组:[[218. 195. 182]。 ... [229。 178. 133.]]。并且不将像素中的零过滤为 [125,25,0] 。仅过滤 [0,0,0] 零像素
    • 你能帮帮我吗??
    【解决方案2】:

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 2012-08-06
      • 2010-11-08
      • 2015-07-09
      • 1970-01-01
      相关资源
      最近更新 更多