Недостаточно цветовых различий, чтобы сделать это легко.Я попытался увеличить контраст и преобразовать в цветовое пространство HSV ( info - opencv ), что облегчает выбор цветов.
Результат:
# load image
img = cv2.imread("hand.png")
#increase contrast
new_image = np.zeros(img.shape, img.dtype)
alpha = 4 # Simple contrast control
beta = -300 # Simple brightness control
for y in range(img.shape[0]):
for x in range(img.shape[1]):
for c in range(img.shape[2]):
new_image[y,x,c] = np.clip(alpha*img[y,x,c] + beta, 0, 255)
# convert to HSV
hsv = cv2.cvtColor(new_image, cv2.COLOR_BGR2HSV)
# set lower and upper color limits
lower_val = np.array([30,0,200])
upper_val = np.array([75,240,255])
# Threshold the HSV image
mask = cv2.inRange(hsv, lower_val, upper_val)
# remove noise
kernel = np.ones((3,3),np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# select whole hand
# set lower and upper color limits
lower_val = np.array([0,0,100])
upper_val = np.array([179,255,255])
# Threshold the HSV image
mask2 = cv2.inRange(hsv, lower_val, upper_val)
# create a mask that has the whole hand, but not the prssure points
mask_combined = cv2.bitwise_xor(mask, mask2)
# Create a copy of the image
image = img.copy()
# Fill copy image with a blue-green-ish color
image[:] = (150, 150, 20)
# use the combined mask to color in upressured area's of the hand
res2 = cv2.bitwise_and(image,image, mask= mask_combined)
# Fill copy image with red color(set each pixel to red)
image[:] = (20, 20, 205)
# use the pressure mask to color in pressured area's
res = cv2.bitwise_and(image,image, mask= mask)
# combine colored images
final = dst = cv2.add(res2,res)
#show image
cv2.imshow("img", img)
cv2.imshow("result", final)
cv2.imshow("mask", mask)
cv2.imshow("mask2", mask_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()
Примечание: я обрезал предоставленное вами изображение, если у вас будет полное изображение, результат может улучшиться путем настройки цветовых границ и морфологии - читайте об этом здесь