长沙分类信息网-长沙新闻网

带你用 Python + 人脸识别自动裁剪头像 !

2023-12-29 8:09:50发布次查看发布人:
之前我们写了一篇制作人物关系图的文章,在这篇文章的最后,我们留下了一个需求:将剧照中的人物裁剪为圆形头像,美化关系图。
也就是把这种干巴巴的图变的图文并茂一点:
python学习交流群:1004391443,这里有资源共享,技术解答,还有小编从最基础的python资料到项目实战的学习资料都有整理,希望能帮助你更了解python,学习python。
对于这个需求,大家的第一反应可能是 ps,但 ps 用来干这件事情我觉得太“重”了,有没有更轻便的办法来实现呢?
今天来介绍两个办法:一是 ppt 的图片编辑功能处理单张图片;二是利用 python 实现人脸识别+图像处理批量裁剪。
ppt 的图片操作功能在很多时候是简单有效的,而且很多电脑上没有装 ps,ppt 则是都有的。如果想要裁剪圆形头像只需要三步:
1、插入图片
2、裁剪图片,根据需要裁剪头像范围,并设置横纵比例为1:1,
3、裁剪完成后再次选择裁剪图片-裁剪为形状-椭圆,即可完成圆形头像制作,最后另存为图片即可。
两步裁剪其实可以合成一步,大家实践一下就明白
用 ppt 来处理单张图片是可以的,但是假如我们这次要一次性处理十几个甚至上百个人物图片,那么每次都要人工确定一下头像的位置,然后进行裁剪,如此低效的重复劳动对程序员来说绝对不能忍的。接下来我们使用 python 实现自动化人脸识别和图片裁剪功能。
利用 python 实现裁剪圆形头像分为以下步骤:
1、利用人脸识别接口确定人脸在图片中的位置
2、计算出需要裁剪的区域
3、利用 pil 库进行裁剪
人脸识别的提供功能很丰富,像我们之前使用到的颜值打分、年龄等。我们这次用到的其实是最基础的功能——人脸检测,即通过人工智能检测图片中是否有人脸,并标出其区域位置。
人脸检测的功能几乎所有的人脸识别接口都会提供,所以我们随便用一个就好。这次我们用微软的 api 来做测试,当然你也可以使用百度、face ++等公司的 api,只需要替换掉请求接口的部分就可以了。
你可以下面的网址申请微软 api 试用:
/zh-cn/services/cognitive-services/face/
接口的使用各家不同,一般来讲会提供一个 key ,在通过网络请求时作为身份鉴别的依据。官方文档一般都会给出详细介绍和示例,这里就不再赘述了,直接上代码。
import requests
import json
headers = {
content-type: application/json,
ocp-apim-subscription-key: 修改为自己的 key,
}
params = {
returnfaceid: true,
returnfacelandmarks: false,
# returnfaceattributes: {string},
recognitionmodel: recognition_01,
returnrecognitionmodel: false,
}
api_url = /face/v1.0/detect
data = {
url: 修改为图片 url
}
response = requests.post(api_url, data=data, headers=headers, params=params)
face = json.loads(response.text)
微软的图片接口支持网络图片地址和字节流两种方法,上面的代码是网络图片的地址的写法,使用时需要填入自己的 key 并修改图片 url。
如果要使用本地图片,则需要修改为下面的代码。
import requests
import json
headers = {
content-type: application/octet-stream,
ocp-apim-subscription-key: 修改为自己的 key,
}
params = {
returnfaceid: true,
returnfacelandmarks: false,
# returnfaceattributes: {string},
recognitionmodel: recognition_01,
returnrecognitionmodel: false,
}
img_path = 修改为本地图片路径
api_url = /face/v1.0/detect
data = open(img_path, rb).read()
response = requests.post(api_url, data=data, headers=headers, params=params)
face = json.loads(response.text)
这段代码会返回一个 json 格式的数据:
[
{
faceid: c5c24a82-6845-4031-9d5d-978df9175426,
recognitionmodel: recognition_02,
facerectangle: {
width: 78,
height: 78,
left: 394,
top: 54
}}
]
如果检测到图片中有多个人脸,则会返回多组坐标数据。需要注意的一个问题是,微软的接口 url 要请求 /face/v1.0/detect
data = open(path, rb).read()
response = requests.post(api_url, data=data, headers=headers, params=params)
facerectangle = json.loads(response.text)[0][facerectangle]
print(facerectangle)
crop_left = facerectangle[left] - facerectangle[width]
crop_right = facerectangle[left] + facerectangle[width] * 2
crop_top = facerectangle[top] - facerectangle[height]
crop_bottom = facerectangle[top] + facerectangle[height] * 2
img = image.open(path).convert(rgb)
cropped = img.crop((crop_left, crop_top, crop_right, crop_bottom))
npimage = np.array(cropped)
h, w = cropped.size
# 新建圆形遮罩图层
alpha = image.new(l, cropped.size, 0)
draw = imagedraw.draw(alpha)
draw.pieslice([0, 0, h, w], 0, 360, fill=255)
npalpha = np.array(alpha)
npimage = np.dstack((npimage, npalpha))
# 保存图片结果
image.fromarray(npimage).save(os.path.splitext(path)[0] + _circle.png)
if __name__ == __main__:
files = os.listdir(r存放图片的路径)
for file in files:
file_path = os.path.join(r存放图片的路径, file)
cut_circle(file_path)
小结:
在这篇文章中,我们介绍了使用 ppt 裁剪圆形头像的方法,并学习了如何通过 python 自动化批量裁剪圆形头像。主要用到的知识点有:
1、微软人脸识别接口的调用
2、pil 库实现裁剪功能
遗留问题:
1、裁剪区域的合理性:如果人脸在图片中的位置过于靠近边缘,就会导致我们计算的裁剪区域超出图片区域,裁剪结果中就会出现黑色部分,比如下面这张:
2、一张图片中如果有多个人脸,微软 api 就会返回多组值,可以遍历处理每个人脸。这次我为了方便,用的都是单人的图片。

该用户其它信息

推荐信息

长沙分类信息网-长沙新闻网
关于本站