这是个很普遍的需求,很多人都会需要。但是往往这种简单的功能,却被商家包装成商品来售卖,要么会员,要么加群关注,想搞个无损的还得加钱!我曾苦苦找了一两个小时,也找不到一个免费好用的工具或网站。
然而,这样普遍的一个功能,网上找到的实现方法却都还没跟上时代,还是采用捕捉背景色来进行阈值分割,二值化,然后在进行逐个像素替换。那种效果可想而知,仅能针对自己的图片慢慢调参。
实践一番,我采用如下方法进行处理,可以做到功能通用,效果不错。以后背景色想换什么色就什么色,图片还能无损!
人像分割
最终处理效果好不好,关键在于人像和背景的分割好不好,传统的图像处理技术是无法做到通用的,还是得以来深度学习来处理,但是这个技术门槛高呀,就别自己折腾了,用别人现成的:百度API
这个api就是分割人像和背景的,且不限于证件照。具体看api文档介绍。
PS:百度的api处理的效果只能说是基本满意,因为我发现美图也是用的同样的思路,但是美图的处理效果好,体现在头发的边缘处理。百度api处理的仔细看,还是会有原来的背景色的影子。确实专业搞图的比较牛逼哈。奈何美图不对外提供api呀。
图像融合公式
思路是把处理好的人像图当成是上层图层A,然后生成一个想要的背景色图层B,位于底层(这个思路也是观察美图的处理形式发现的)。
网上找了一圈,没有人告诉我证件照换底色是不是可以这么做。于是自己实践,现在告诉你,确实可以这么做!
图层融合的公式是不透明度法
:C=d*A+(1-d)*B
C:表示最终结果图
d:代表人像图的透明度,他是一个矩阵,再具体点,d是人像图的Alpha通道。
A:表示人像图,他是RGBA 四通道图
B:表示背景图,由自己生成RGB三通道即可
没错,A图层由百度人像分割里的接口提供,就是RGBA通道的。Alpha 通道的值表示是人像区域的可能性,取值范围是[0-255],值越大可能性越高。同时也表示了透明度,值越大越不透明。
实践真实有效,代码就自己实现了,难的还是这个思路。以后再也不求人了