2014-11-11 3 views
1

그래서 RGB 값으로 그림을 저장해야하는 프로그램을 만들려고합니다.PIL을 사용하여 파이썬에서 RGB 값을 사용하여 그림 저장

inputIm = Image.open(args.target) 

#denoises image and saves it to disk 
#data = DenoiseImage(inputIm, factor, iters) 
data = np.array(inputIm.getdata()) 
n, m = inputIm.size 
print data 
outputIm = Image.new("RGB", (n, m)) 
outputIm.putdata(data) 
outputIm.save(args.fileName) 

을 내가 그것을 실행할 때이 오류가 : 이것은 내가 다음, 데이터를 얻을 열고 다시 데이터를 사용하여 이미지를 저장할 수 있는지 확인하기 위해 설정 한 단순한 테스트입니다

Traceback (most recent call last): 
    File "DenoiseNumpyWeave.py", line 253, in <module> 
    outputIm.putdata(data) 
    File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1215, in putdata 
    self.im.putdata(data, scale, offset) 
SystemError: new style getargs format but argument is not a tuple 

그러나 인쇄 데이터 라인에 튜플이있는 배열이 인쇄되므로 실제로 잘못하고 있는지 이해할 수 없습니다. 흑백 사진 ("RGB"대신 "L")을 사용하여 똑같은 작업을 수행했으며 튜플이없는 배열 (단일 값 대신)에 넣어서 효과가있었습니다.

+0

'putdata'처럼 보이지만 배열 수가 많습니다. 먼저 일반 목록으로 변환 해보십시오. – Kevin

+0

@kevin 나는 이것을하려고했다 :'data2 = list (data)'그리고 나서 putdata에서 data2를 사용했으나 작동하지 않았다. 같은 오류. – user2875994

+0

@kevin은 또한 list (data) 대신에'data2 = data.tolist()'를 시도해 보았습니다. 즉,'data2 = list (inputIm.getdata())'가 작동합니다 ...하지만 numpy 배열이 필요하므로 그렇게 할 수 없습니다. – user2875994

답변

0

Numpy는 getdata이 제공하는 튜플을 배열로 변환했습니다. putdata이 작동하려면 튜플로 다시 변환해야합니다.

outputIm.putdata([tuple(pixel) for pixel in data]) 
+0

이렇게하면 다음과 같은 오류가 발생합니다. http://pastebin.com/4SWXASy8 생각이 잘 들립니다. – user2875994

+0

@ user2875994 대괄호가 아닌'tuple' 다음에 괄호가 필요합니다. 내 대답에서 줄 복사/붙여 넣기를 시도하십시오. –

+0

@ user2875994 그러면 pastebin의 오류 메시지에 대괄호가 표시되는 이유는 무엇입니까? 그리고 명확하지 않은 경우에는 '튜플 (픽셀)'이 아니라 '튜플 (픽셀)'입니다. –

1

흑백 이미지에 단일 채널 ("L")이있어 nx m 어레이가 정상적으로 작동합니다. RGB 이미지에는 3 개의 채널이 있기 때문에 n-by-m-by-3 배열이 필요할 수 있습니다.

+0

어? 내가 ("L")을 사용했을 때, 나는 그 중 하나의 값을 가지는 1 차원 배열을 가졌다. (예를 들어, n 배열. 여기에서 사용하려고하는 배열은 3으로 n입니다. 다시 말하면, 올바르게 이해할 수 있습니다. – user2875994

+0

@ user2875994 그가 의미하는 바는 Numpy가'getdata '에서 오는'n * m' 3 튜플을 단일'n * m * 3' 배열로 평평하게 만든 것입니다. 다시 박살 내야합니다. –

+0

@MarkRansom getdata는 이미 그것을 평평하게하므로, 그렇게해서는 안됩니다. 그것은 결코 3 차원 구조가 아닙니다. – user2875994

관련 문제