6

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を含めません..次のコードでは歪みがあります欲しかったのですが、がめちゃくちゃです。おそらく、R、G、B プレーンに歪みを適用してから、結果を 1 つのイメージに合成する必要があります。または、画像をパレット化してから、元のパレットを適用します

(ちなみに、画像は 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()
4

3 に答える 3

13

np.roll正弦関数に従って各行または列を回転させるために使用できます。

from scipy.misc import lena
import numpy as np
import matplotlib.pyplot as plt

img = lena()

A = img.shape[0] / 3.0
w = 2.0 / img.shape[1]

shift = lambda x: A * np.sin(2.0*np.pi*x * w)

for i in range(img.shape[0]):
    img[:,i] = np.roll(img[:,i], int(shift(i)))

plt.imshow(img, cmap=plt.cm.gray)
plt.show()

ここに画像の説明を入力

于 2014-02-21T22:02:01.197 に答える