实现Photoshop液化工具箱中向前变形工具

来源:互联网 发布:java cxf教程 编辑:程序博客网 时间:2024/04/30 10:43

前段时间转载了http://blog.csdn.net/jia_zhengshen/article/details/11650461小铁的《实现Photoshop液化工具箱中的向前变形工具》这篇文章,我发现在网上寻找中文的液化算法也只能找到http://blog.csdn.net/jia_zhengshen/article/details/11599133  这么两篇文章。资料太少了,本来以为很容易实现的功能由于资料很少,拖了很长的时间才实现了一个简单的液化功能。

液化算法中ps使用的是网格算法,GIMP使用的是交互式算法。本人采用的是gimp的交互式算法。

在GIMP中的Iwarp对话框中的截图如下:


现在说说我是如何实现的:

首先参考了上面提到的两篇文章,他们提到了一篇很重要的论文:Interactive Image warping这是Andreas Gustafsson的硕士毕业论文。很具有参考价值。最终要的是他提出了一个变形的公式:


这是由变形后的像素位置向前推导出变形前的像素位置的公式,如果只看这个公式的话可能看不懂,只能结合论文来看。

下面说一下我对这个公式参数的理解:

x变形后的像素的位置。

rmax使用鼠标画的圆的半径

c坐标的原点。这个参数需要特别注意,c既是原来圆的圆心,又是坐标的原点。所以在使用上述公式的时候,都需要把图像的坐标系转换到以原来圆的圆心(c)为坐标原点的坐标系,这是很重要的,我开始由于没有搞清楚坐标系而出现了很多的错误。

m鼠标移动的最终位置。

u推导出的原来坐标的位置。

用程序实现上述公式后,

使用鼠标确定原来的圆心,后来的圆心。在整幅图像的像素位置通过调用上面的公式确定在原来图像上的位置,然后最近邻差值或者双线性差值来确定像素值。然后程序就基本上程序就实现了,。

下面贴一下我使用opencv来做的程序的效果


红色圆圈中圈住的位置是有程序做的变形。原图可以在:

http://blog.csdn.net/jia_zhengshen/article/details/11655999中找到。

就像小铁提到的商业的软件应该是多次变形做到效果的。这是我下一步努力的方向,现在的程序只实现了单步变形。

原创粉丝点击