2014-02-21 186 views
3

我想在python連鎖反應應用於圖像。 ? 我發現枕頭的im.transform(im.size,Image.MESH,......是有可能 也許我必須加載與numpy的圖像和應用算法 我也發現了這一點:http://www.pygame.org/project-Water+Ripples-1239-.htmlPython的圖像失真

ripple

手動另一種方式,但我不知道任何的算法,這是我的開始並不做任何事情......

#!/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() 

編輯:

我真的很想保持這種結構(使用枕頭。我已經在我的項目extensivly使用,如果我可以,我不會添加任何其他依賴性),但不包括scipi或matplotlib .. 用下面的代碼我有我想要的失真,但顏色都搞砸了。 也許我必須將失真施加到R,G,B平面然後撰寫的結果在一個圖像。 或者palettize的圖像,然後運用原始的調色板。

(順便說一句圖像將被用作紋理顯示在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

你爲什麼不試着這麼做:

# import scipy 
# import numpy as np 
for x in range(cols): 
    column = im[:,x] 
    y = np.floor(sin(x)*10)+10 
    kernel = np.zeros((20,1)) 
    kernel[y] = 1 
    scipy.ndimage.filters.convolve(col,kernel,'nearest') 

我把這個就在眼前,所以你需要稍微調整一下。罪的頻率肯定太高,請檢查here。但我認爲這應該起作用。

7

你可以使用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() 

enter image description here

0

我有一個有時顏色似乎搞砸了(得到了一些奇怪的紅線)試圖在這裏所提出的解決方案時,將罪後類似的問題。無法解決它。

我明白,如果有可能原來的海報不希望有更多的依賴關係,但對於那些不受限制的,這裏是一個由scikit文檔提供替代樣品溶液:從上面的文檔

http://scikit-image.org/docs/dev/auto_examples/transform/plot_piecewise_affine.html#sphx-glr-auto-examples-transform-plot-piecewise-affine-py

複製:

import numpy as np 
import matplotlib.pyplot as plt 
from skimage.transform import PiecewiseAffineTransform, warp 
from skimage import data 


image = data.astronaut() 
rows, cols = image.shape[0], image.shape[1] 

src_cols = np.linspace(0, cols, 20) 
src_rows = np.linspace(0, rows, 10) 
src_rows, src_cols = np.meshgrid(src_rows, src_cols) 
src = np.dstack([src_cols.flat, src_rows.flat])[0] 

# add sinusoidal oscillation to row coordinates 
dst_rows = src[:, 1] - np.sin(np.linspace(0, 3 * np.pi, src.shape[0])) * 50 
dst_cols = src[:, 0] 
dst_rows *= 1.5 
dst_rows -= 1.5 * 50 
dst = np.vstack([dst_cols, dst_rows]).T 


tform = PiecewiseAffineTransform() 
tform.estimate(src, dst) 

out_rows = image.shape[0] - 1.5 * 50 
out_cols = cols 
out = warp(image, tform, output_shape=(out_rows, out_cols)) 

fig, ax = plt.subplots() 
ax.imshow(out) 
ax.plot(tform.inverse(src)[:, 0], tform.inverse(src)[:, 1], '.b') 
ax.axis((0, out_cols, out_rows, 0)) 
plt.show()