4

在java中实现像photoshop那样的液化过滤器的最基本方法是什么?

4

2 回答 2

6

基本上,您有一个源图像和一个网格。网格开始是具有完美正方形的网格,但会变形。该算法是

  For Each section of the mesh
     For Each pixel of the section
         (x, y) = Location in original photo for this pixel // (floating point)
         color = ColorFromOriginal(x, y) // this needs to blend neighboring pixels if fractional
         setColor(color)

找出 (x, y) 是简单的几何图形——将变形正方形的中心映射到原始正方形的中心,然后找出您在 (N, S, E, W) 中的哪个三角形并将变形的三角形映射到原本的。

  +---------+
  |\       /|
  | \  N  / |
  |  \   /  |
  |   \ /   |
  | W  X  E |
  |   / \   |
  |  /   \  |
  | /  S  \ |
  |/       \|
  +---------+

一旦你有了浮点的 (x, y),通过混合与该浮动 pt 重叠的四个像素来计算它的颜色。以重叠的比例协调。

整数像素

   +----+----+----+
   |    |    |    |
   |    |    |    |
   +----+----+----+
   |    |    |    |
   |    |    |    |
   +----+----+----+
   |    |    |    |
   |    |    |    |
   +----+----+----+

浮动点。像素叠加在上面

   +----+----+----+
   |    |    |    |
   |   x|xx  |    |
   +----+----+----+
   |   x|xx  |    |
   |    |    |    |
   +----+----+----+
   |    |    |    |
   |    |    |    |
   +----+----+----+

结果颜色是四个像素在重叠的比例中的混合。

这正是resize(resample)的算法——网格没有变形,只是放大了,所以不需要三角形步骤,但思路是一样的。

于 2010-10-17T15:21:57.840 回答
5

您正在寻找的基本上是一个扭曲过滤器,您可以查看:http ://www.jhlabs.com/ip/filters/ 我猜您正在寻找的是http://www.jhlabs.com/ip /filters/WarpFilter.html

希望有帮助

于 2010-10-24T11:13:05.573 回答