因为前段时间跟CG方面打了不少交道,所以产生了今天的问题.
对于视频的合成,我们可能都需要用到很多地方的素材,来源于各个地方,包括电视台,大部分素材都有一个共同点,都加了水印或台标.可以想像,在制作我们自己的作品时,肯定不能出现别人的标志,所以我们得去除原来的水印(注:在不侵犯别人的权利的前提下).今天我们只讨论对简单水印的处理.
先看一张加了水印的图:
<img src=http://www.bezier.com.cn/study/1.jpg>
其实我们可以看出,这个最终的图(C)其实是用另一张标志图(B)与原图(A)叠加而得到(叠加的方式这里就不作讨论,有兴趣的可以去参看参考书),叠加时赋予了一定的透明度(Tran).
这时,我们可以大概的形成一个公式:
A+ B*Tran=C
但是按此公式的话,原图像没有任何修改,标志图的象素值全部叠加原图像上,最张图像应该变亮,而事实上却没有,那肯定原图像在叠加过程中也有了一定的衰减过程(Atten)
即:
A*Atten + B*Tran=C
推测标志图增加了多少值,原图像应该减少多少,即Atten=1-Tran.
经测试确实是如此(测试过程省略)
即A*(1-Tran) + B*Tran=C
由此,我们如果想把加过水印的图像恢复到原样,只需要:
A=(C-B*Tran)/(1-Tran).
公式已经出来了,下面我们就开时做了。
这时候我们引入一个常用且普通的图像文件类型:TGA
这种文件格式简单,它由头文件、数据文件、附加文件构成。
TGA头文件结构
struct TargaHeader
{
BYTE IDLength;
BYTE ColormapType;
BYTE ImageType;//如果为02则表示未压缩,(A0)表示压缩
BYTE ColormapSpecification[5];
<