python cv2 извлечь черный цвет из изображения трехмерного массива скин-маски - PullRequest
0 голосов
/ 02 августа 2020

Из изображения лица я получаю скин-маску изображения с cv2, как я нахожу здесь

Результатом является массив массивов (изображение), состоящий из пикселей (RGB)

Проблема в том, что на итоговой картинке очень много черных пикселей, не принадлежащих коже.

skin picture

I want to get 2d array with non-black pixels as [[218,195,182]. ... [229,0, 133]] -with only the pixels of facial skin color

I try to eject the black pixels by finding all the pixels whose all RGB is equal to 0 like [0,0,0] only:

Note that I do not want to extract zeros from pixels like: [255,0,125] [0,0,255] and so on.

        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

Как сделать написать его более эффективным и быстрым способом?

Спасибо

Ответы [ 2 ]

1 голос
/ 02 августа 2020

, если значения равны нулю, они по существу не влияют на ваше изображение в матричном умножении. Но если вы хотите показать свое изображение без черных пикселей, вы можете добавить альфа-маску и сделать эти пиксели прозрачными.

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()]
0 голосов
/ 09 августа 2020

Я задал этот вопрос здесь по-другому и получил отличный ответ.

Удачи!

...