说明

我有一个手指的图像(背景为绿色),并且想要提取指甲作为特征。我的目标是用功能描述指甲的轮廓。但是我还没有尝试过的功能部分,我敢肯定我可以自己弄清楚。我很难拔出指甲,希望得到您的帮助。您可以在帖子末尾找到图片。

我到目前为止所做的:

  • 加载图片
  • 调整图像大小以减少计算量
  • 处理它(模糊,去除绿色背景,转换为灰度
  • 从图像中提取指甲(如何?)

  • 我尝试进行圆形检测或椭圆形检测。使用霍夫变换的圆检测无法识别指甲。椭圆检测也是如此(除了花了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
    

    图片

    起始图像:

    移除绿色并转换为灰色:

    轮廓:

    最佳答案

    我认为,考虑到语义/实例分割问题,解决此问题的最佳方法可能是使用Encoder-Decoder(例如U-Net)类型的体系结构,因为使用基于常规图像处理的方法来解决此问题颇具挑战性。但是,我会尝试一下。
    在我的方法中,我按照贝娄提到的步骤来检测指甲区域(结果并不完美,但是您可以对此进行改进):

  • 对平滑的饱和度值应用阈值以分割ROI
  • 使用Sobel运算符进行梯度计算,然后将阈值应用于边缘区域检测(具有高梯度值)
  • 轮廓检测和指甲区域分割



  • 逐步输出:
    python - 如何用手指从图像中提取指甲?-LMLPHP

    关于python - 如何用手指从图像中提取指甲?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58236218/

    10-10 10:16