Как получить 2D-массив из 3D-массива изображения, удалив черные пиксели, то есть [0,0,0], в python - PullRequest
1 голос
/ 04 августа 2020

У меня есть изображение кожи лица с черными пикселями вокруг него.

Изображение представляет собой трехмерный массив, состоящий из пикселей (RGB)

массив изображения = ширина * высота * RGB

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

Черные пиксели представляют собой массив нулей. [0,0,0]

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:

        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

Обратите внимание, что я не хочу извлекать нули из пикселей, например: [255,0,125] [ 0,0,255] и так далее, поэтому ненулевой метод numpy не подходит

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

Спасибо

Ответы [ 2 ]

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

Предположим, ваше изображение находится в img. Вы можете использовать приведенный ниже код:

import numpy as np

img=np.array([[[1,2,0],[24,5,67],[0,0,0],[8,4,5]],[[0,0,0],[24,5,67],[10,0,0],[8,4,5]]])
filter_zero=img[np.any(img!=0,axis=-1)]   #remove black pixels 
print(filter_zero)

Результат (2D-массив):

[[ 1  2  0]
 [24  5 67]
 [ 8  4  5]
 [24  5 67]
 [10  0  0]
 [ 8  4  5]]
0 голосов
/ 04 августа 2020

Допустим, ваше изображение img с формой (w, h, 3) или (h, w, 3). Тогда вы могли бы сделать:

import numpy as np
img = np.array(img)                          # If your image is not a numpy array
myList = img[np.sum(img, axis = -1) != 0]    # Get 2D list
...