Я пытаюсь обнаружить кожу. Я нашел красивую и простую формулу для определения кожи на изображении RGB. Единственная проблема в том, что циклы for очень медленные, и мне нужно ускорить процесс. Я провел некоторое исследование, и векторизация могла бы закрепить мои циклы for, но я не знаю, как использовать это в моем случае.
Вот код моей функции:
Функция получает 1 параметр типа: numpy массив с формой (144x256x3), dtype = np.uint8
Функция возвращает координаты первого обнаруженного пикселя цвета кожи (как numpy .array [высота, ширина]) ; количество пикселей обнаруженных кожи (int) и рассчитанный угол (слева направо) первого обнаруженного изображения кожи (float)
# picture = npumpy array, with 144x256x3 shape, dtype=np.uint8
def filter_image(picture):
r = 0.0
g = 0.0
b = 0.0
# In first_point I save first occurrence of skin colored pixel, so I can track person movement
first_point = np.array([-1,-1])
# counter is used to count how many skin colored pixels are in an image (to determine distance to target, because LIDAR isn't working)
counter = 0
# angle of first pixel with skin color (from left to right, calculated with Horizontal FOV)
angle = 0.0
H = picture.shape[0]
W = picture.shape[1]
# loop through each pixel
for i in range(H):
for j in range(W):
# if all RGB are 0(black), we take with next pixel
if(int(picture[i,j][0]+picture[i,j][1]+picture[i,j][2])) == 0:
continue
#else we calculate r,g,b used for skin recognition
else:
r = picture[i,j][0]/(int(picture[i,j][0]+picture[i,j][1]+picture[i,j][2]))
g = picture[i,j][1]/(int(picture[i,j][0]+picture[i,j][1]+picture[i,j][2]))
b = picture[i,j][2]/(int(picture[i,j][0]+picture[i,j][1]+picture[i,j][2]))
# if one of r,g,b calculations are 0, we take next pixel
if(g == 0 or r == 0 or b == 0):
continue
# if True, pixel is skin colored
elif(r/g > 1.185 and (((r * b) / math.pow(r + b + g,2)) > 0.107) and ((r * g) / math.pow(r + b + g,2)) > 0.112):
# if this is the first point with skin colors in the whole image, we save i,j coordinate
if(first_point[0] == -1):
# save first skin color occurrence
first_point[0] = i
first_point[1] = j
# here angle is calculated, with width skin pixel coordinate, Hor. FOV of camera and constant
angle = (j+1)*91 *0.00390626
# whenever we detect skin colored pixel, we increment the counter value
counter += 1
continue
# funtion returns coordinates of first skin colored pixel, counter of skin colored pixels and calculated angle(from left to right based on j coordinate of first pixel with skin color)
return first_point,counter, angle
Функция работает хорошо, единственная проблема - скорость!
Спасибо за помощь!