0%

Python图像处理特效库EffectLab

EffectLab是使用Python编写的一个快速测试图像处理特效的实验库,EffectLab目前基于PIL。方便测试图像处理算法。

EffectLab正在处于开发过程中(其实几天前才开始),日后会逐渐增加更多的特效。 目前特效处理用纯Python实现,这个运行速度十分地缓慢,所以后期会用C把部分特效重写。

我本人挺喜欢做图像处理的,想将EffectLab作为我们在两年前编写的图像处理程序Imagination Factory的生命的延续。我想知道Photoshop里面的那些工具的究竟是怎么实现的,也非常感谢仔华给我一个与图像处理和安全相关的任务啊~因为目前做的一个东西的一部分需要进行些图像处理,于是决定将图像处理部分拆分出作为独立的图像特效库EffectLab来维护。

目前特效都设计为过滤器,接受一张图像和输出一张图像。不同的过滤器可以组合在一起形成新的特效过滤器。Unix的管道过滤器的思想真是美好啊。

python
1
new_effect = lambda img: effect_a(effect_b(effect_c(img)))

源码请见Github: https://github.com/cedricporter/EffectLab/downloads

目前实现的效果

左边为原图,右边为处理后的图片。

镜头变形效果[1]

首先将图像映射到长宽取值范围都为[-1, 1],然后从笛卡尔坐标系映射到极坐标系。然后我们就可以控制r(半径坐标)和\theta(角坐标、极角或方位角,有时也表示为\phit)。

r = r ^ 2

python
1
effect = RadianFormulaEffect(lambda r, phi: (r ** 2, phi))

r = sqrt®

python
1
effect = RadianFormulaEffect(lambda r, phi: (sqrt(r), phi))

x = math.sin(x * math.pi / 2)
y = math.sin(y * math.pi / 2)

python
1
effect = LensWarpEffect(lambda x, y: (sin(x * math.pi / 2), sin(y * math.pi / 2)))

局部变形效果(液化)[2]

这个是Photoshop里面的液化效果。就是将照片作为液体胶泥一样,然后可以任意推动来变形。

对于这个公式另开一片文章讲解。

下图鼠标起点圆心为(130, 120),鼠标终点为(130, 50),圆半径为100.也就是向上拖动。

python
1
effect = LocalWarpEffect((130, 120), (130, 50), 100)

参考资料

  1. Image warping / distortion

  2. Andreas Gustafsson, Interactive Image Warping