1 引言
最近有小伙伴咨询怎么用python来制作一个好看的圆形头像,如下所示的效果:左侧为原图,右侧为我们圆形头像生成图。
自从学了python来做图像处理,这种简单图像处理使用10行代码即可搞定。
2 处理步骤
思考我们遇到的问题,换句大白话就是如何在图像里扣出一块圆形区域(ROI 感兴趣区域)。嗯嗯,比较直观的想法是采用mask掩膜的方式来实现了。
1)首先我们来生成一个圆形掩码
代码如下:
roi = np.zeros(image.shape[:2], np.uint8)
roi = cv2.circle(roi, (200, 200), 150, 255, cv2.FILLED)
结果如下:
2) 生成全白背景图和掩码后的图
代码:
mask = np.ones_like(image) * 255
mask1 = cv2.bitwise_and(mask, image, mask=roi) # roi内保留 其他置黑
mask2 = cv2.bitwise_and(mask, mask, mask=~roi) # roi外保留 roi内置黑
结果如下:
左侧为mask1的图像,右侧为mask2的图像
3) 生成圆形头像图
有了上述mask1和mask2的结果图,只需要将两幅图相加即可得到最终结果:
out = mask1 + mask2
cv2.imshow('out', out)
cv2.waitKey(0)
结果如下:
3 完整代码
本节完整代码如下所示:
import cv2
import numpy as np
# Original image
image = cv2.imread('./sample1.jpg')
# Circular ROI in original image; must be selected via an additional mask
roi = np.zeros(image.shape[:2], np.uint8)
roi = cv2.circle(roi, (200, 200), 150, 255, cv2.FILLED)
# Target image; white background
mask = np.ones_like(image) * 255
# Copy ROI part from original image to target image
mask1 = cv2.bitwise_and(mask, image, mask=roi)
mask2 = cv2.bitwise_and(mask, mask, mask=~roi)
out = mask1 + mask2
cv2.imshow('out', out)
cv2.waitKey(0)
4 其他示例
本节的圆形头像生成结果图如下:
可爱的皮卡丘:
帕丁顿熊:
5 总结
通过上述简单步骤,我们通过利用圆形掩码,进而实现了圆形头像效果图,可以愉快地拿来做头像啦!
您学肥了嘛?
关注公众号《AI算法之道》,获取更多AI算法资讯。