【发布时间】:2014-02-21 17:17:45
【问题描述】:
我正在尝试对 python 中的图像应用波纹效果。 我找到了 Pillow 的 im.transform(im.size, Image.MESH,.... 可能吗? 也许我必须用 numpy 加载图像并应用算法。 我还发现了这个:http://www.pygame.org/project-Water+Ripples-1239-.html
另一种手动方式,但我不知道任何算法。这是我的开始。它没有做任何事情......
#!/usr/bin/env python3
from PIL import Image
import sys
import numpy
import math
im = Image.open(sys.argv[1])
im.show()
matrix = numpy.asarray(im)
width = im.size[0]
height = im.size[1]
amplitude = ? # parameters
frequency = ?
matrix_dest = numpy.zeros((im.size[0],im.size[1],3))
for x in range(0, width):
for y in range(0, height):
pass # ç_ç
im2 = Image.fromarray(numpy.uint8(matrix_dest))
im2.show()
编辑:
我真的很想保留这个结构(使用枕头。我已经在我的项目中广泛使用,如果可以的话,我不会添加任何其他依赖项)并且不包括 scipi 或 matplotlib.. 使用以下代码,我得到了我想要的失真,但是 colors 搞砸了。 也许我必须将失真应用到 R,G,B 平面,然后将结果合成到一张图像中。 或者调色图像,然后应用原始调色板。
(顺便说一句,图像将用作纹理,以在 3D 环境中显示流动的水。)
im = Image.open(sys.argv[1])
im.show()
m = numpy.asarray(im)
m2 = numpy.zeros((im.size[0],im.size[1],3))
width = im.size[0]
height = im.size[1]
A = m.shape[0] / 3.0
w = 1.0 / m.shape[1]
shift = lambda x: A * numpy.sin(2.0*numpy.pi*x * w)
for i in range(m.shape[0]):
print(int(shift(i)))
m2[:,i] = numpy.roll(m[:,i], int(shift(i)))
im2 = Image.fromarray(numpy.uint8(m2))
im2.show()
【问题讨论】: