python实现人像卡通化
时间: 2023-12-04 14:05:06 浏览: 135
基于Python实现人像卡通化项目源码+数据集+模型,将真实照片转换为卡通风格的非真实感图像
5星 · 资源好评率100%
要实现人像卡通化,可以使用Python中的OpenCV和Dlib库进行人脸检测和关键点定位,然后使用PIL库进行图像处理和美化。
以下是一个简单的代码示例:
```python
import cv2
import dlib
from PIL import Image, ImageFilter, ImageDraw
# 加载人脸检测器和关键点检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# 加载图像
img = cv2.imread('input.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = detector(gray)
# 遍历每张脸并进行卡通化处理
for face in faces:
# 获取关键点
landmarks = predictor(gray, face)
# 将关键点转换为numpy数组
landmarks = list(map(lambda p: (p.x, p.y), landmarks.parts()))
# 根据关键点位置截取头像
x_min = min([p[0] for p in landmarks])
y_min = min([p[1] for p in landmarks])
x_max = max([p[0] for p in landmarks])
y_max = max([p[1] for p in landmarks])
face_img = img[y_min:y_max, x_min:x_max]
# 对头像进行美化处理
face_pil = Image.fromarray(face_img)
# 磨皮
face_pil = face_pil.filter(ImageFilter.BLUR)
# 瘦脸
draw = ImageDraw.Draw(face_pil)
draw.line(landmarks[0:17], fill=(255, 255, 255), width=10)
draw.line(landmarks[26:16:-1], fill=(255, 255, 255), width=10)
# 大眼
iris_size = int(abs(landmarks[39][0] - landmarks[36][0]) / 4)
draw.ellipse((landmarks[36][0] - iris_size, landmarks[36][1] - iris_size,
landmarks[36][0] + iris_size, landmarks[36][1] + iris_size), fill=(255, 255, 255))
draw.ellipse((landmarks[45][0] - iris_size, landmarks[45][1] - iris_size,
landmarks[45][0] + iris_size, landmarks[45][1] + iris_size), fill=(255, 255, 255))
# 将处理后的头像放回原图像中
img[y_min:y_max, x_min:x_max] = face_pil
# 保存卡通化后的图像
cv2.imwrite('output.jpg', img)
```
以上代码实现了磨皮、瘦脸和大眼等效果。你可以根据需要自定义各种美化效果。
阅读全文