从边界框获取皮肤的二进制掩码
Obtaining binary mask of skin from bounding box
我训练了一个对象检测模型来检测手的指尖。我已经从边界框坐标中提取了指尖。这是我得到的:
现在我想从这些图像中获取二进制掩码,其中仅包括指尖区域。我已经尝试过这些方法,但没有得到满意的结果。
- 使用 canny 边缘检测器方法。
- 使用 Grabcut 方法。
- 归一化图像,然后从HSV中提取h通道以找到最大轮廓。
我想从这些边界框中提取指尖区域,我目前迷路了,希望能找到正确方向的线索。
编辑
红色背景图片:
您可以选择 LAB color space。
A-channel 的一个极端标识红色。因此在这个极端应用 Otsu 阈值可以很好地隔离它。
代码:
img = cv2.imread('finger_1.png')
# convert to LAB color space
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
# apply Otsu threshold on A-channel
th = cv2.threshold(lab[:,:,1], 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
结果:
作为进一步的选择,您可以尝试标准化相同的 A-channel 并继续进行。
另请参阅 this post on how to segment green color。
我训练了一个对象检测模型来检测手的指尖。我已经从边界框坐标中提取了指尖。这是我得到的:
现在我想从这些图像中获取二进制掩码,其中仅包括指尖区域。我已经尝试过这些方法,但没有得到满意的结果。
- 使用 canny 边缘检测器方法。
- 使用 Grabcut 方法。
- 归一化图像,然后从HSV中提取h通道以找到最大轮廓。
我想从这些边界框中提取指尖区域,我目前迷路了,希望能找到正确方向的线索。
编辑 红色背景图片:
您可以选择 LAB color space。
A-channel 的一个极端标识红色。因此在这个极端应用 Otsu 阈值可以很好地隔离它。
代码:
img = cv2.imread('finger_1.png')
# convert to LAB color space
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
# apply Otsu threshold on A-channel
th = cv2.threshold(lab[:,:,1], 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
结果:
作为进一步的选择,您可以尝试标准化相同的 A-channel 并继续进行。
另请参阅 this post on how to segment green color。