22

我在哪里可以找到图像失真的算法?Blur 和其他经典算法的信息很多,但更复杂的算法却很少。特别是,我对漩涡效应图像失真算法感兴趣。

4

5 回答 5

30

我找不到任何参考资料,但我可以大致了解失真效果的工作原理。

失真的关键是一个函数,它取失真图像中的两个坐标 (x,y),并将它们转换为原始图像中的坐标 (u,v)。这指定了失真的反函数,因为它将失真图像带回原始图像

为了生成失真图像,循环 x 和 y,使用逆失真函数从 (x,y) 计算点 (u,v),并将 (x,y) 处的颜色分量设置为与那些相同在原始图像中的 (u,v) 处。通常使用插值(例如http://en.wikipedia.org/wiki/Bilinear_interpolation)来确定 (u,v) 处的颜色,因为 (u,v) 通常不完全位于像素的中心,但是而不是在像素之间的某个分数点。

漩涡本质上是一种旋转,其中旋转角度取决于与图像中心的距离。一个例子是:

a = amount of rotation
b = size of effect

angle = a*exp(-(x*x+y*y)/(b*b))
u = cos(angle)*x + sin(angle)*y
v = -sin(angle)*x + cos(angle)*y

在这里,为了简单起见,我假设漩涡的中心在 (0,0)。漩涡可以放在任何地方,方法是在失真函数之前从 x 和 y 中减去漩涡位置坐标,然后将它们添加到 u 和 v 之后。

周围有各种漩涡效果:一些(如上图)仅在局部区域产生漩涡,并且漩涡的量向图像边缘逐渐减小。其他人则增加了朝向图像边缘的漩涡。这种事情可以通过使用 angle= 线来完成,例如

angle = a*(x*x+y*y)
于 2008-10-22T12:41:10.187 回答
21

Jerry's Java Image Filters有很多图像过滤器/效果的 Java 实现。也许你可以从那里得到灵感。

于 2008-10-22T16:28:40.307 回答
5

漩涡和其他类似的东西是像素位置的矩阵变换。您制作一个新图像并从图像上的某个位置获取颜色,该位置是通过将当前位置乘以矩阵获得的。

矩阵取决于当前位置。

这是一个很好的 CodeProject 展示如何做到这一点

http://www.codeproject.com/KB/GDI-plus/displacementfilters.aspx

于 2008-10-22T12:44:56.280 回答
2

有一个新的图形库有很多功能

http://code.google.com/p/picasso-graphic/

于 2009-10-13T05:11:20.267 回答
0

看看ImageMagick。它是一个图像转换和编辑工具包,具有所有流行语言的接口。

-displace 运算符可以使用正确的置换贴图创建漩涡。

如果您出于某种原因对 ImageMagick 界面不满意,您可以随时查看过滤器的源代码并从那里开始。

于 2008-10-22T12:41:35.227 回答