2013-01-22 6 views
52

이미지의 푸리에 변환을 수행하기 위해 이전에 찾은 게시물을 사용하여 Python 이미지 라이브러리 (PIL)를 사용하여 일부 이미지 처리를 수행했으며 저장 기능을 사용할 수 없습니다. 전체 코드는 잘 작동하지만 그냥 실 거예요 결과 이미지를 저장합니다PIL로 이미지를 저장하려면 어떻게해야합니까?

save_handler = SAVE[string.upper(format)] # unknown format 
    KeyError: '.BMP' 

어떻게 파이썬 PIL로 이미지를 저장할 수 있습니다 내가 얻을

from PIL import Image 
import numpy as np 

i = Image.open("C:/Users/User/Desktop/mesh.bmp") 
i = i.convert("L") 
a = np.asarray(i) 
b = np.abs(np.fft.rfft2(a)) 
j = Image.fromarray(b) 
j.save("C:/Users/User/Desktop/mesh_trans",".bmp") 

오류는 다음과 같다?

답변

67

파일 확장자에 관한 오류는 중 (점없이) bmp를 사용, 처리, 또는 통과되었습니다 이미 확장자가있는 출력 이름. 이제 주파수 도메인의 데이터를 정수 이미지로 저장하기 위해 올바르게 수정해야하는 오류를 처리하기 위해 PIL은 float 데이터를 bmp로 저장할 수 없다는 것을 알려줍니다. 나는이 오래된 것을 알고

import sys 
import numpy 
from PIL import Image 

img = Image.open(sys.argv[1]).convert('L') 

im = numpy.array(img) 
fft_mag = numpy.abs(numpy.fft.fftshift(numpy.fft.fft2(im))) 

visual = numpy.log(fft_mag) 
visual = (visual - visual.min())/(visual.max() - visual.min()) 

result = Image.fromarray((visual * 255).astype(numpy.uint8)) 
result.save('out.bmp') 
+1

안녕하세요 대단히 감사합니다. 이제 완벽하게 작동합니다! 이제 내가해야 할 일은 모든 단계를 이해하는 것 뿐이지 만 그렇게 나쁘지는 않을 것입니다. 도움을 주셔서 대단히 감사합니다 – user1999274

+0

@ user1999274 중요한 차이점은 불연속 데이터 때문에 나중에 사용하는 데 요점을 보지 못하기 때문에'rfft2' 대신'fft2'를 사용하는 것입니다. 나머지는 완전히 외형입니다. 즉, 로그 인수를 적용하지 않고 푸리에 변환을 올바르게 시각화 할 수 없습니다. 그런 다음 정규화는 [0, 255] 범위로 변환하기 위해 작업을 단순하게 유지하는 것입니다. – mmgp

+0

'visual '에 분산이 없다면 기본값이 될 것입니다. (잡을 가치는 없지만 잡을 가치가 있습니다.) –

5

.bmp (예 : BMP과 일치하지 않음) 전에 .을 제거해보십시오. 오류에서 알 수 있듯이 save_handler은 제공된 format의 대문자이며 SAVE에서 일치하는 것을 찾습니다. 그러나 해당 개체의 해당 키는 BMP (.BMP 대신)입니다.

PIL에 대해 많이 알지는 못하지만 일부 빠른 검색을 통해 이미지의 mode에 문제가있는 것처럼 보입니다. 에 j의 정의를 변경하면 :

j = Image.fromarray(b, mode='RGB') 

그러나 나는 PIL의 아주 작은 지식을 가지고 있습니다, 그래서의 같은 @의 mmgp의 솔루션을 사용하는 것이 좋습니다 것 (나를 위해 작동하는 듯/그는 명확하게 무엇을하고 있는지 알고있다 :)). mode 유형의 경우 this 페이지를 사용했는데 잘하면 그 중 하나가 효과가 있습니다.

+0

나는 bmp를 제거하려고 시도했지만 여전히 bmp를 사용하지 않았다. 오류는 지금 내가 얻을 : IOError : BMP로 모드 F 쓸 수 없습니다. 나는 문서화를 위해 PIL 페이지를 점검했고 .bmp를 사용했다. 그래서 전반적으로 나는 아직도 그것이 작동하지 않는 이유를 모른다. – user1999274

+0

@ user1999274 나를 위해 일하는듯한 업데이트를 게시했습니다. (세부 사항 부족에 대해 사과드립니다. – RocketDonkey

+0

@RocketDonkey 푸리에 변환 결과를 RGB 색상 공간으로 변환하면 의미없는 이미지가 생기기 때문에 조금 더 똑똑 해집니다. 더 이상 예외를 제기하지 않기 때문에 결과가 정확하다는 것을 의미하지는 않습니다. – mmgp

18

당신은 단순히 PIL은 연장에서 파일 형식을 얻을 수 있도록 할 수 있어야한다, 즉 사용 :

j.save("C:/Users/User/Desktop/mesh_trans.bmp") 
+0

+1, 더 나은 옵션처럼 보입니다 :) – RocketDonkey

+0

입력 해 주셔서 감사합니다. 그러나 내가 저장 함수가 위에서 제안한 것처럼 파일 형식을 가져 오려고하면 다음 오류가 발생합니다. IOError : BMP와 같이 모드 F를 쓸 수 없습니다. 어떤 충고? – user1999274

+0

예, 배열을 float 대신 numpy.uint8 형식으로 변환해야합니다. – wim

3

,하지만 난 발견했습니다 여기에

적절한 시각화를위한 변환 작업을 수행하는 ( fftshift 대신 numpy.asarraynumpy.array를 사용하여 같은 다른 약간의 수정을) 제안하다 open(fp, 'w')을 사용하여 파일을 연 다음 파일을 저장하면됩니다. 예 :

j.save(open(fp, 'w')) 

fp 물론 파일 경로입니다. (베개 포함)

관련 문제