程序matically更改肤色
有没有人知道怎么调整一张图片,让它的肤色和另一张图片的肤色匹配呢?
这个问题可能有点冷门,但我希望能找到之前遇到过这个问题的人!我这样做的目的是想用Python(或者其他编程语言,只要能编程就行)把一张图片中的脸换成另一张图片中的脸。
我找到了一些相关的论文:
- 面部替换:自动替换照片中的面孔 (pdf) (还有:他们的网站)
- 用辐射环境图进行面部重光照 (pdf)
- 在恶劣光照条件下从单张图片重光照面部 (pdf)
不过,这些内容对我来说有点复杂,所以我不知道该怎么根据他们的说法去做。
如果有人能给点建议,我会非常感激,因为我现在真的不知道该怎么办。
1 个回答
4
这里有一些关于如何入门的高层次建议。
基本上,你正在解决一个优化问题。这些算法可以用在很多问题上,有几种比较知名的方法。简单来说,就是:
- 创建一个评分函数,这个函数能给你一个数字,表示结果的好坏。数字越大,结果越好。
- 创建一个函数,它接受输入和一些参数,然后输出一个可以评分的结果。
- 这点很重要:评分函数应该根据第二步的参数有一定的连续性。如果你有两个参数,并把它们在三维空间中画出来(param1, param2, score),那么它看起来就像一个有很多起伏的大山。
- 你现在的任务就是找到这个表面上的最高点。如果你有超过两个参数,那就是一个多维的表面,但思路是一样的。
可以查一下“爬山算法”、“遗传算法”或者“优化问题”。一本不错的Python书是Toby Segaran的《编程集体智能》。
一般来说,爬山算法的步骤大概是:
- 先对参数做个好的猜测。
- 生成输出并进行评分。
- 稍微调整一个参数。
- 对输出进行评分。
- 如果结果更好,就继续这个方向;如果更差,就换个方向。
- 如果卡住了,就去表面的其他地方试试。
- 如果找到一个局部最高点,但不够好,就去其他地方再试试。
不过,实际的算法会比这复杂一些,建议你查查具体的算法。
很多研究的核心就是找到一个好的评分函数,以及如何知道哪些参数有效和如何使用它们。
按照这个大致的框架,试试把亮度/对比度作为你的输出生成函数(亮度和对比度是输入)。在评分方面,你需要一种比较两张照片是否匹配的方法——可以先选择简单的方式(比如硬编码一个区域来检查)。
一旦你开始了,就会对如何进行这个过程有更多的理解,然后可以回去查阅相关论文获取更多想法。