Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Drawing a line from a numpy array

I've been searching far and wide, but I haven't found a solution yet, so I'll ask here. I have a script that creates a large numpy array of coordinate points (~10^8 points), and i then want to draw a polygonal line using the coordinates. PIL's ImageDraw.line works fine for regular lists, but there seems to be a problem when using numpy arrays.

Right now this is my solution:

image = Image.new('RGB', (2**12, 2**12), 'black')
draw = ImageDraw.Draw(image, 'RGB')
draw.line(pos.tolist(), fill = '#00ff00')

where pos is the large numpy array that contains all points in the following order: [x0, y0, x1, y1, ...] (this can be changed if needed). The most time consuming part of the program is the pos.tolist() part, taking up about 75% of runtime.

Is there a way to draw a line and save it to an image and keeping it as a numpy array? I just want a simple image, nothing else besides the line and the black background.

like image 413
maxb Avatar asked Jul 03 '26 06:07

maxb


1 Answers

The list cast can be replaced with a float32 cast as follows

draw.line(pos.astype(np.float32), fill='#00ff00')

And you can get rid of casts in general if, when forming an array of points, you explicitly specify the type as np.float32 for the array of points itself and all arrays with which it interacts, for example

pos = np.ones((2**8, 2), dtype=np.float32).reshape(-1)
pos *= np.random.randint(0, 2**12-1, size=(2**8, 2)).reshape(-1)
image = Image.new('RGB', (2**12, 2**12), 'black')
draw = ImageDraw.Draw(image, 'RGB')
draw.line(pos, fill='#00ff00')

should work fine.

like image 136
Ivan Piatrouski Avatar answered Jul 05 '26 19:07

Ivan Piatrouski



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!