这段时间很火的证件照在线生成技术很是火,所以研究了一下这项技术,原本以为只需要用扣扣人物换一张底色即可,但并非如此,实践证明用python的OpenCV技术来实现非常不理想。一下是我找到的几种证件照换底色代码。
实现代码第一种:
import cv2import numpy as npimg=cv2.imread('timg.jpg')#缩放rows,cols,channels = img.shapeimg=cv2.resize(img,None,fx=0.5,fy=0.5)rows,cols,channels = img.shapecv2.imshow('img',img)#转换hsvhsv=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发布的一款不错的产品百度人像分割 ,通过分割复杂情况下背景来最后分出人像部分。
这里感觉还不错,能分割复杂场景下的图片
这是echo_1994博主给出的具体调用代码
目前最好的效果但是根据测试往往很多地方如 不清晰,图片不正等情况下或者证件照尺寸等问题还是解决不了这个问题,后来百度后找到了一款在线生成证件照的几家平台,个人感觉在线生成证件照(https://www.taobaxiu.com)这个服务平台算是目前不错的,我体验了一下(源代码收费)。
(对比效果图)
虽然运行时间稍微有点久,但是自动抠出来的效果整体还是不错的,并且能准确识别背景以及座椅等复杂情况下的图片,据说有美颜功能等等。
无论是在线生成证件照还是用python实现的代码,无非就是一个能够看谁更加精准的分离人像,至于替换证件照背景是很简单的事情。