利用 Python 实现裁剪圆形头像分为以下步骤:

1、利用人脸识别接口确定人脸在图片中的位置

2、计算出需要裁剪的区域

3、利用 PIL 库进行裁剪

人脸识别的提供功能很丰富,像我们之前使用到的颜值打分、年龄等。我们这次用到的其实是最基础的功能——人脸检测,即通过人工智能检测图片中是否有人脸,并标出其区域位置。

人脸检测的功能几乎所有的人脸识别接口都会提供,所以我们随便用一个就好。这次我们用微软的 API 来做测试,当然你也可以使用百度、Face ++等公司的 API,只需要替换掉请求接口的部分就可以了。

你可以下面的网址申请微软 API 试用:

接口的使用各家不同,一般来讲会提供一个 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 = 'https://westcentralus.api.cognitive.microsoft.com/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 = 'https://westcentralus.api.cognitive.microsoft.com/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 要请求 HTTPS,如果请求 HTTP 网址,则会返回 404 错误代码。

接下来我们需要计算出需要裁剪的区域,由于人脸检测主要是以五官为特征点,返回的坐标主要以脸部为主,不包含头发,人脸检测的区域大概如下图所示。

我这边估算后简单地将人脸检测的区域扩大一倍作为裁剪区域,可以满足需求,当然大家可以根据实际情况进行调整。

接下来我们使用 Python 中的 PIL 库进行裁剪。PIL只支持到 Python 2.7,之后版本应该选择安装 Pillow 库。如果安装的是 Anaconda,已经内置了 pillow,无需安装,否则需要 pip 安装。(假定我们已经通过上面的 API 获取到了人脸上下左右的坐标)

from PIL import Image, ImageDraw

import numpy as np

faceRectangle = {

"width": 78,

"height": 78,

"left": 394,

"top": 54

}

# 计算需要裁剪的区域

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_path = '本地图片路径'

img = Image.open(img_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('cut.png')

经过以上三个步骤,我们已经实现了使用 Python 自动裁剪圆形头像的功能,我们可以把上面的代码封装为一个函数,留下图片路径作为参数,就可以进行批量处理了。

import os

from PIL import Image, ImageDraw

import requests

import json

import numpy as np

def cut_circle(path):

headers = {

'Content-Type': 'application/octet-stream',

'Ocp-Apim-Subscription-Key': 'your key',

}

params = {

'returnFaceId': 'true',

'returnFaceLandmarks': 'false',

# 'returnFaceAttributes': '{string}',

'recognitionModel': 'recognition_01',

'returnRecognitionModel': 'false',

}

API_url = 'https://westcentralus.api.cognitive.microsoft.com/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)

python圆形_利用 Python 实现裁剪圆形头像相关推荐

  1. 利用python发送邮件_利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...

  2. excel python插件_利用 Python 插件 xlwings 读写 Excel

    Python 通过 xlwings 读取 Excel 数据 去年底公司让我做设备管理,多次委婉拒绝,最终还是做了.其实我比较喜欢技术.做管理后发现现场没有停机率统计,而原始数据有,每次要自己在Exce ...

  3. 动态照片墙 python 实现_利用python生成照片墙的示例代码

    这篇文章主要介绍了利用python生成照片墙的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 PIL(Python Im ...

  4. java调python 监控_利用Python实现一个简单的系统监控图表

    作为运维人员,想必大家肯定都做过这样的事情:为了监控系统资源使用情况,开了若干个窗口,来回切换看输出: 只要我切得够快,性能异常点就逃不过我的眼睛! 这个时候你要是有个监控工具自然是很好的,例如我们美 ...

  5. python推荐_利用Python构建一个简单的推荐系统

    原标题:利用Python构建一个简单的推荐系统 摘要:快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫.在此之前读者需要对pandas和numpy等数据分析包有所了解. 什么 ...

  6. autocad支持python吗_利用python控制Autocad:pyautocad方式

    发现pyautocad模块:可以用python控制autocad的包.今天把文档中的重点内容摘录出来,以后绘图.计算大工程量.或者识别施工图的时候时候也许可以用到. 一.连接cad pyautocad ...

  7. python拼图_利用python制作拼图小游戏的全过程

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 关注公众号:Python学习指南,回复"拼图"即可获取源码 环境搭建 安装P ...

  8. ppt python 图表_利用python分析weibo数据做成图表放入PPT中

    起因 很久以前,就有个想法,就是自动分析微博的数据,但是之前一直想的是网页版展示,flask想学了好久都没学,偶然的一次看到了一篇关于python处理pptx的文章,再加上同窗三年的室友在毕业后竟然主 ...

  9. python 认证机构_利用Python爬了SIG官网BQB认证公司清单,我有一些重大发现..

    关注"无线技术联盟"提供有价值的物联网市场信息和最新的技术分析 利用Python爬取了蓝牙联盟上近一年BQB认证公司的清单,把爬到的有价值的东西写出来分享给大家. 1 蓝牙认证 产 ...

  10. python 搜索引擎_利用Python抓取搜索引擎结果

    前一段时间一直在研究如何用python抓取搜索引擎结果,在实现的过程中遇到了很多的问题,我把我遇到的问题都记录下来,希望以后遇到同样问题的童鞋不要再走弯路. 1. 搜索引擎的选取 选择一个好的搜索引擎 ...

最新文章

  1. 用 Python 画圣诞树的 N 种玩法
  2. 编写c语言程序 斐波那契,C语言程序实现斐波那契数列的解题思路???
  3. AI处理器热潮正在消退
  4. CentOS7 64位下载配置与安装教程(超详细图文教程)
  5. 爬取前尘无忧python职位信息并保存到mongo数据库
  6. 手把手maven的功能/安装/使用/idea集成
  7. Python divmod 函数 - Python零基础入门教程
  8. realtek audio console无法连接rpc服务_RPC服务在游戏中的简单运用
  9. String去重方法
  10. 今天,你的安卓 App 崩了吗?
  11. Windows Azure 云计算服务: 怎样按需选择并计算它将花费多少钱呢?
  12. 企业实战|基于Cobbler实现多版本系统批量部署
  13. 报表工具都支持哪些数据源类型?
  14. 爬取4399网站的图片
  15. 【Python】xlwings-删除重复行
  16. 反编译008神器,修改手机型号与android版本号信息
  17. OSPF虚连接(VLINK)配置案例
  18. 【微信小程序/实现】实现留言墙功能页面
  19. YOLOv5训练自己的数据集之详细过程篇
  20. cesium 关于feature的知识点

热门文章

  1. 自己动手搭建一个简单的基于Hadoop的离线分析系统之一——网络爬虫
  2. linux之ls -l命令详解
  3. 用 snapper 轻松玩转 Btrfs 的快照功能
  4. 从零开始学统计 02 | 总体参数
  5. 在Vmware14中安装Linux系统教程(图文教程)
  6. RPG游戏制作-01-搭建游戏框架,初进游戏世界
  7. android开发split的方法在String中的特殊使用
  8. [BZOJ1779][Usaco2010 Hol]Cowwar 奶牛战争(最大流)
  9. 开放式激光振镜+运动控制器(三):振镜矫正
  10. allegro 移动元件时飞线隐藏或者拖动元件时飞线不显示?