import numpy as np from PIL import Image nperiods = 21 # number of periods size = 1000 # size of square image # waveform: any function with arguments and return values in [0..1] waveform = lambda u: 2 * np.where(u<0.5, u, 1-u) # triangle # waveform = lambda u: np.where(u<0.5, 0, 1) # rectangle # waveform = lambda u: u # sawtooth # waveform = lambda u: (np.sin(2*pi*u) + 1) / 2 # sine def mapping(y, x): u = nperiods * np.arctan2(y - size/2, x - size/2) / (2*np.pi) % 1 return np.uint16(0xffff * waveform(u) + 0.5) array = np.fromfunction(mapping, (size, size), dtype=np.uint16) Image.fromarray(array).save(f'muster-{nperiods}-{size}.png')