我在哪里可以找到图像失真的算法?Blur 和其他经典算法的信息很多,但更复杂的算法却很少。特别是,我对漩涡效应图像失真算法感兴趣。
5 回答
我找不到任何参考资料,但我可以大致了解失真效果的工作原理。
失真的关键是一个函数,它取失真图像中的两个坐标 (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)
Jerry's Java Image Filters有很多图像过滤器/效果的 Java 实现。也许你可以从那里得到灵感。
漩涡和其他类似的东西是像素位置的矩阵变换。您制作一个新图像并从图像上的某个位置获取颜色,该位置是通过将当前位置乘以矩阵获得的。
矩阵取决于当前位置。
这是一个很好的 CodeProject 展示如何做到这一点
http://www.codeproject.com/KB/GDI-plus/displacementfilters.aspx
有一个新的图形库有很多功能
看看ImageMagick。它是一个图像转换和编辑工具包,具有所有流行语言的接口。
-displace 运算符可以使用正确的置换贴图创建漩涡。
如果您出于某种原因对 ImageMagick 界面不满意,您可以随时查看过滤器的源代码并从那里开始。