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