2017-10-06 1 views
1

스케치로부터 래스터 좌표PIL로 이미지를 플로팅하는 더 빠른 방법은 무엇입니까? I는 (X, Y)의 세트가

x = [167, 109, 80, 69, 58, 31] 
y = [140, 194, 227, 232, 229, 229] 

I는 그 스케치를 재생성 및 이미지로 저장할. 순간 나는이 같은 PIL의 선 그리기 기능을 사용하고 있습니다 : 그것을 할 수있는 빠른 방법이 있는지

from PIL import Image, ImageDraw 
img = [[1, 1]] 
im = Image.new('L', (256, 256), 255) 
imgdata = np.array(img[0][1])*256 + np.array(img[0][1]) 
draw = ImageDraw.Draw(im) 
for i in range(len(x)-1): 
    draw.line((x[i],y[i], x[i+1], y[i+1]),fill=0,width=2) 
im.save('test.png') 

output

내가 궁금합니다. (x, y) 점은 그리기 순서이므로 Image.putdata()을 사용하면 도움이 될까요?

+0

'Image.putdata()'는 다른 방법으로 픽셀 데이터를 만든 다음 Image 객체에 채우기를 요구합니다. 당신은 그것을 할 수있는 기존의 모듈을 찾을 수 있습니다 (선을 그리십시오). PIL로 가능한 가장 빠른 방법입니다. – martineau

+1

그러나 [[ImageDraw.line()'] (http://pillow.readthedocs.io/en/4.3.x/reference/ImageDraw.html#PIL.ImageDraw.PIL.ImageDraw.ImageDraw.line)이 적용됩니다. _all_ 하나의 호출에서의 좌표이므로'for' 루프를 제거하고 적어도 약간의 속도 향상을 얻을 수 있습니다. – martineau

+1

'for' 루프를 없애고 하나의'draw.line (* zip (x, y), fill = 0, width = 2)'호출을 사용해보십시오. – martineau

답변

1

이 다소 나마 내가 draw.line()에 하나의 호출을 사용하여 전체 라인을 그릴 수있는 대한 의견 (산세 zip() 전화에 * 접두사)에서 제안 된 것을 보여줍니다.

장점은 코드가 적어서 약간 (테스트 데이터로 눈에 띄지 않을지라도)이 더 빠를 가능성이 높습니다.

import numpy as np 
from PIL import Image, ImageDraw 

img = [[1, 1]] 
x = [167, 109, 80, 69, 58, 31] 
y = [140, 194, 227, 232, 229, 229] 

im = Image.new('L', (256, 256), 255) 
imgdata = np.array(img[0][1])*256 + np.array(img[0][1]) 
draw = ImageDraw.Draw(im) 

#for i in range(len(x)-1): 
# draw.line((x[i],y[i], x[i+1], y[i+1]),fill=0,width=2) 

draw.line(zip(x, y), fill=0, width=2) # Draws entire line. 
#im.save('test.png') 
im.show() # Display the image. 

는 무해하지만, 여분의 수반 것이다, 파이썬 2에서 할 확인 될 동안, (다음에 zip()를 사용하여 라인을 변경해야 할 것파이썬 3.x를 처리하기 위해 그 필요하지 않습니다.) :

draw.line(list(zip(x, y)), fill=0, width=2) # Draws entire line. 
관련 문제