因业务需求,需要把所有的人物证件照底色替换为红色,请问前端有什么好的方法嘛,因图片原来的底色也不确定,可能颜色较深,或者颜色较浅,有没有可以比较兼容的方法
因业务需求,需要把所有的人物证件照底色替换为红色,请问前端有什么好的方法嘛,因图片原来的底色也不确定,可能颜色较深,或者颜色较浅,有没有可以比较兼容的方法
13 回答13k 阅读
8 回答2.9k 阅读
2 回答5.2k 阅读✓ 已解决
5 回答1.5k 阅读
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
最快捷的莫过于使用云服务商提供的抠图功能了,之前阿里云貌似有给我推过相关产品的邮件。
自己做的话挺难的,我试了一下,如果用边缘色差作为基准,可以去掉一些近乎纯色的背景,但如果背景色差略大一点,或者人像有与背景相近的颜色,效果就惨不忍睹了——


(效果太吓人了,希望没有给你留下心理阴影)
虽然这个尝试不是很成功,但基本能够标识出人像的边缘,这样一来,如果结合一些经验,比如一般情况下的半身人像的基本轮廓,就可以很好地把人像的大致边界标记出来。
然后呢?
然后有一种抠图算法叫做 Alpha Matting [1] [2] ,这种算法的良好实现能抠头发丝,但是需要有前后景的大致界限,所以基于这个算法的应用通常都会先让用户标记出大致轮廓 —— 如果你用过 PS 魔棒抠图的话,就知道我在说什么了 —— 把我们标记出来的边界稍加修改,就可以代替这个轮廓。
魔棒做得还是很不错的,涂一下就可以,而 Alpha Matting 至少需要涂抹三个区域:背景、主体、边界,比如下图中的黑白灰:
[1]
由于不会图形学也不会 openCV.js,光是倒腾这个色差分离就耗去了小半天时间,再加上没有找到 Alpha Matting 算法的 JS 实现,所以我没打算继续下去,这个东西是在东家的项目里搞的,所以只能把部分模块代码贴出来:
这个实现毕竟不是正规的图形学手段,不建议使用,不过整体思路可以参考一下:用 openCV.js 大致分离背景色,加上经验数据处理成三色标记图,然后应用 Alpha Matting 算法。
实际上使用 TenserFlow.js 训练一个神经网络也可以在浏览器里抠图,但是性能要求比较高,而作为前端,我们的一个基本素养就是不要对用户机器的性能有过高的期望。