这段时间很火的证件照在线生成技术很是火,所以研究了一下这项技术,原本以为只需要用扣扣人物换一张底色即可,但并非如此,实践证明用python的OpenCV技术来实现非常不理想。一下是我找到的几种证件照换底色代码。
第一种:
import cv2
import numpy as np
img=cv2.imread('timg.jpg')
#缩放
rows,cols,channels = img.shape
img=cv2.resize(img,None,fx=0.5,fy=0.5)
rows,cols,channels = img.shape
cv2.imshow('img',img)
#转换hsv
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower_blue=np.array([90,70,70])
upper_blue=np.array([110,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
cv2.imshow('Mask', mask)
#腐蚀膨胀
erode=cv2.erode(mask,None,iterations=1)
cv2.imshow('erode',erode)
dilate=cv2.dilate(erode,None,iterations=1)
cv2.imshow('dilate',dilate)
#遍历替换
for i in range(rows):
for j in range(cols):
if dilate[i,j]==255:
img[i,j]=(0,0,255)#此处替换颜色,为BGR通道
cv2.imshow('res',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
最终效果
整体布局情况下还是容易扣出但是一般就失去了证件照真正的意义(既然自己原本就是一张蓝色图片换成红色也基本上没必要)。
这项技术主要难度就在于抠出人体范围,如何告诉程序这个范围在那一块,如果是背景单色的请客下很容易识别出来,但是复杂情况下就是很糟糕的一种情况了,这里我找到了一款百度AI发布的一款不错的产品百度人像分割 ,通过分割复杂情况下背景来最后分出人像部分。
这里感觉还不错,能分割复杂场景下的图片
import cv2
import base64
import numpy as np
import time
from aip import AipBodyAnalysis
# 在百度云中申请,每天各接口有 500 次调用限制.
startTime = time.time()
APP_ID = '****'
API_KEY = '****'
SECRET_KEY = '****'
client = AipBodyAnalysis(APP_ID, API_KEY, SECRET_KEY)
imgfile = 'test2.jpg'
ori_img = cv2.imread(imgfile)
height, width, _ = ori_img.shape
with open(imgfile, 'rb') as fp:
img_info = fp.read()
seg_res = client.bodySeg(img_info)
labelmap = base64.b64decode(seg_res['labelmap'])
nparr = np.fromstring(labelmap, np.uint8)
labelimg = cv2.imdecode(nparr,1)
labelimg = cv2.resize(labelimg,(width,height), interpolation=cv2.INTER_NEAREST)
new_img = np.where(labelimg==1, 255, labelimg)
maskfile = imgfile.replace('.jpg', '_mask.png')
cv2.imwrite(maskfile, new_img)
res_imgfile = imgfile.replace('.jpg', '_res.jpg')
result = cv2.bitwise_and(ori_img, new_img)
cv2.imwrite(res_imgfile, result)
endTime = time.time()
print("useTime: ", endTime-startTime)
print('Done.')
————————————————
版权声明:本文为CSDN博主「echo_1994」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/echo_1994/article/details/84317833
这是echo_1994博主给出的具体调用代码
但是根据测试往往很多地方如 不清晰,图片不正等情况下或者证件照尺寸等问题还是解决不了这个问题,后来百度后找到了一款在线生成证件照的几家平台,个人感觉在线生成证件照(https://www.taobaxiu.com)这个服务平台算是目前不错的,我体验了一下(源代码收费)。
(对比效果图)
虽然运行时间稍微有点久,但是自动抠出来的效果整体还是不错的,并且能准确识别背景以及座椅等复杂情况下的图片,据说有美颜功能等等。
无论是在线生成证件照还是用python实现的代码,无非就是一个能够看谁更加精准的分离人像,至于替换证件照背景是很简单的事情。