使用PIL裁剪并保存面部标志

时间:2018-11-19 07:59:22

标签: python image-processing face-recognition

我想修剪上唇和下唇并将其保存为一张图像。 我正在使用这个GitHub库face_recognition

这是代码:

from PIL import Image, ImageDraw
import face_recognition

# Load the jpg file into a numpy array
image = face_recognition.load_image_file("me.jpg")

# Find all facial features in all the faces in the image
face_landmarks_list = face_recognition.face_landmarks(image)


for face_landmarks in face_landmarks_list:
    pil_image = Image.fromarray(image)
    d = ImageDraw.Draw(pil_image, 'RGBA')


    # Gloss the lips
    d.polygon(face_landmarks['top_lip'], fill=(150, 0, 0, 128), outline=None)
    d.polygon(face_landmarks['bottom_lip'], fill=(150, 0, 0, 128), outline=None)
    d.line(face_landmarks['top_lip'], fill=(150, 0, 0, 64), width=8)
    d.line(face_landmarks['bottom_lip'], fill=(150, 0, 0, 64), width=8)


    # cropped_top_lip = image.crop(face_landmarks['top_lip'])
    # cropped_top_lip.save('top_lip.jpg')
    # cropped_bottom_lip = image.crop(face_landmarks['bottom_lip'])
    # cropped_bottom_lip.save('bottom_lip.jpg')

    pil_image.save('me2.jpg')

这将返回完整图像,我只需要嘴唇部分。

这是face_landmarks['top_lip']的印刷品:

  

[((498,937),(546,926),(597,924),(637,9​​30),(676,922),(726,   922),(772、929),(756、935),(677、940),(637、946),(597、942),   (516,942)]

1 个答案:

答案 0 :(得分:1)

.crop方法采用一个列表,其中包含裁剪区域的4个坐标-

[
    X_top_left_corner, Y_top_left_corner, 
    X_bottom_right_corner, Y_bottom_right_corner
] 

我想从face_landmarks['top_lip']的坐标中可以看出,这是嘴唇轮廓上的点。因此,您需要找到最左上角和最右下角,并将其传递给crop方法。

  

[((498,937),(546,926),(597,924),(637,9​​30),(676,922),(726,922),(772,929),(756,935) ),(677、940),(637、946),(597、942),(516、942)]

要找到左上角,您需要从此数据中找到最少的X坐标和最少的Y坐标。而且这两个坐标可以出现在单独的元组中。

对于右下角,您需要最高的X坐标和最高的y坐标。同样,这两个可以存在于单独的元组中。


您可以这样确定拐角:

x1 = min(my_list)[0] # top left corner X
y1 = min(my_list, key=lambda pair: pair[1])[1] # top left corner Y

x2 = max(my_list)[0] # bottom right corner X
y2 = max(my_list, key=lambda pair: pair[1])[1] # bottom right corner Y

在这种情况下,最小X坐标为498,最小Y坐标为922。这些将成为您的左上角。

最高X坐标为772,最高Y坐标为946。这些将是您的右下角。

这应该适合修剪上唇:

# im.crop([x1, y1, x2, y2])
im.crop([498, 922, 772, 946])