Я пытаюсь применить эффект пульсации к изображению в python. ?. я нашел im.transform подушку в (im.size, Image.MESH, .... возможно Может быть, я должен загрузить изображение с NumPy и применить алгоритм я нашел: http://www.pygame.org/project-Water+Ripples-1239-.htmlPython Искажение изображения
.
другой путь вручную, но я не знаю ни одного алгоритма, это мой старт он не делает ничего ...
#!/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()
EDIT:.
Я бы очень хотел сохранить эту структуру (используя подушку. Я уже использую extensivly в своем проекте, и если могу я не добавлю никакой другой зависимости), и не включая scipi или matplotlib. Со следующим кодом у меня есть искажение, которое я хотел, но цвета привинчены. Возможно, мне нужно применить искажения к R, G, B плоскостям, а затем составить результат на одном изображении. Или palettize изображение, а затем применить оригинальную палитру.
(Btw изображение будет использоваться в качестве текстуры для отображения движущейся воды в 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()