Описание
У меня есть изображение пальца (с зеленым фоном), и я хочу извлечь ноготь пальца как элемент. Моя цель - описать контуры ногтя с помощью функций. Однако, функциональную часть я еще не пробовал, и я уверен, что смогу понять сам. Я изо всех сил пытаюсь извлечь ноготь и хотел бы получить от вас помощь. Вы можете найти изображения в конце поста.
Что я сделал до сих пор:
- загрузить изображение
- изменить размеризображение для меньших вычислительных усилий
- обработка его (размытие, удаление зеленого фона, преобразование в серую шкалу
- извлечение ногтя из изображения (как?)
IПопытка сделать обнаружение круга или обнаружение эллипса. Обнаружение круга с использованием грубого преобразования не распознает ноготь. То же самое для обнаружения эллипса (за исключением того, что это заняло 2 минуты и это слишком долго ждать). Теперь мойВопрос в том, существует ли простой способ решения проблемы и извлечения ногтя?
Я также использовал обнаружение краев / обнаружение контуров, чтобы извлечь ноготь, однако это было слишком неточно и бесполезно.
Моей мечтой было бы дополнительно отделить серую / более темную часть в начале ногтя, но мне не удалось это сделать, и поэтому я отказался от этой части. Вы знаете хороший и простой способ, который я хотел бы услышать.
Важные фрагменты кода:
# imports
# helper functions
def remove_green(img):
empty_img = np.zeros_like(img)
RED, GREEN, BLUE = (2, 1, 0)
reds = img[:, :, RED]
greens = img[:, :, GREEN]
blues = img[:, :, BLUE]
# loop over the image, pixel by pixel
tmpMask = (greens < 35) | (reds > greens) | (blues > greens)
img[tmpMask == 0] = (0, 0, 0) # remove background from original picture
empty_img[tmpMask] = (255, 255, 255) # mask with finger in white
return img, empty_img
# main function
# load and process
image = cv2.imread(imagePath, 1) # load
image = cv2.resize(image, None, fx=0.3, fy=0.3) # resize
image = cv2.GaussianBlur(image, (3, 3), 0)
no_green_image, mask_finger = remove_green(image) # remove green
gray = cv2.cvtColor(no_green_image, cv2.COLOR_BGR2GRAY) # gray scalEd
gray_mask_finger = cv2.cvtColor(mask_finger, cv2.COLOR_BGR2GRAY)
# refine edges
kernel = np.ones((5, 5), np.uint8)
gray_mask_finger = cv2.morphologyEx(gray_mask_finger, cv2.MORPH_GRADIENT, kernel)
detect_nail(gray_mask_finger)
# here I struggle
Изображения
Начальное изображение:
Удалено зеленое и преобразовано в серое:
Контуры: