EffectLab是使用Python编写的一个快速测试图像处理特效的实验库,EffectLab目前基于PIL。方便测试图像处理算法。
EffectLab正在处于开发过程中(其实几天前才开始),日后会逐渐增加更多的特效。 目前特效处理用纯Python实现,这个运行速度十分地缓慢,所以后期会用C把部分特效重写。
我本人挺喜欢做图像处理的,想将EffectLab作为我们在两年前编写的图像处理程序Imagination Factory的生命的延续。我想知道Photoshop里面的那些工具的究竟是怎么实现的,也非常感谢仔华给我一个与图像处理和安全相关的任务啊~因为目前做的一个东西的一部分需要进行些图像处理,于是决定将图像处理部分拆分出作为独立的图像特效库EffectLab来维护。
目前特效都设计为过滤器,接受一张图像和输出一张图像。不同的过滤器可以组合在一起形成新的特效过滤器。Unix的管道过滤器的思想真是美好啊。
1 | new_effect = lambda img: effect_a(effect_b(effect_c(img))) |
源码请见Github: https://github.com/cedricporter/EffectLab/downloads
目前实现的效果
左边为原图,右边为处理后的图片。
镜头变形效果[1]
首先将图像映射到长宽取值范围都为[-1, 1],然后从笛卡尔坐标系映射到极坐标系。然后我们就可以控制(半径坐标)和
(角坐标、极角或方位角,有时也表示为
或
)。
r = r ^ 2
1 | effect = RadianFormulaEffect(lambda r, phi: (r ** 2, phi)) |
r = sqrt®
1 | effect = RadianFormulaEffect(lambda r, phi: (sqrt(r), phi)) |
x = math.sin(x * math.pi / 2)
y = math.sin(y * math.pi / 2)
1 | effect = LensWarpEffect(lambda x, y: (sin(x * math.pi / 2), sin(y * math.pi / 2))) |
局部变形效果(液化)[2]
这个是Photoshop里面的液化效果。就是将照片作为液体胶泥一样,然后可以任意推动来变形。
对于这个公式另开一片文章讲解。
下图鼠标起点圆心为(130, 120),鼠标终点为(130, 50),圆半径为100.也就是向上拖动。
1 | effect = LocalWarpEffect((130, 120), (130, 50), 100) |
参考资料
-
Andreas Gustafsson, Interactive Image Warping