PIL로 이미지를 저장하려면 어떻게해야합니까?


119

이미지의 푸리에 변환을 수행하기 위해 이전에 찾은 게시물을 사용하여 Python 이미지 라이브러리 (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")

내가 얻는 오류는 다음과 같습니다.

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

Pythons PIL로 이미지를 어떻게 저장할 수 있습니까?

답변:


144

파일 확장자에 관한 오류가 처리되었습니다. 사용하거나 BMP(점없이) 이미 확장자가있는 출력 이름을 전달하십시오. 이제 오류를 처리하려면 정수 이미지로 저장할 주파수 영역의 데이터를 적절하게 수정해야합니다.이 오류 PIL는 BMP로 저장하기 위해 부동 데이터를 허용하지 않는다고 말합니다.

다음은 적절한 시각화를위한 변환을 수행하기위한 제안 ( fftshiftnumpy.array대신 및 사용 과 같은 기타 사소한 수정 포함 numpy.asarray)입니다.

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

@ user1999274의 주요 차이점은 불연속 데이터의 경우 나중에 사용하는 요점이 없기 때문에 fft2대신 사용하는 것입니다 rfft2. 나머지는 순전히 외형 적입니다. 즉, 로그 인자를 적용하지 않고 푸리에 변환을 제대로 시각화 할 수 없습니다. 그런 다음 정규화는 [0, 255] 범위로의 변환을 간단하게 유지하는 것입니다.
mmgp 2013-01-23

1
visual = (visual - visual.min()) / (visual.max() - visual.min())경우 기본값으로 visual아무런 차이가 없다 (가능성,하지만 가치 잡기)

1
이 코드를 내 문제에 사용하려고했지만 평범한 검정색 이미지가 나타납니다. 누구든지 이것에 대해 어떤 생각이 있습니까? stackoverflow.com/questions/24266000/…
user961627

32

PIL이 확장자에서 파일 유형을 얻도록 할 수 있어야합니다.

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

1
입력 해 주셔서 감사합니다. 그러나 저장 기능이 위에서 제안한 파일 형식을 얻으려고 할 때 다음 오류가 발생합니다. IOError : 모드 F를 BMP로 쓸 수 없습니다. 어떤 충고?
user1999274 2013-01-23

1
예, 배열을 numpy.uint8float가 아닌 dtype으로 변환해야합니다 .
2013 년

6

( 예상대로 일치하지 않음) .전에 제거하십시오 . 오류에서 알 수 있듯이 는 제공 한 대문자를 사용한 다음 . 그러나 해당 객체의 해당 키는 (대신 )입니다..bmpBMPsave_handlerformatSAVEBMP.BMP

에 대해 잘 모르겠지만 PIL몇 가지 빠른 검색 mode을 통해 이미지 의 문제인 것 같습니다 . 정의 j를 다음으로 변경 :

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

나를 위해 일하는 PIL것처럼 보였습니다 (그러나 나는에 대한 지식이 거의 없으므로 @mmgp의 솔루션을 사용하는 것이 좋습니다. 의 유형에 대해이 페이지를 mode사용했습니다. 페이지에서 선택 사항 중 하나가 효과가 있기를 바랍니다.


나는 bmp를 위해 .bmp를 제거하려고 시도했지만 여전히 작동하지 않았습니다. 내가 지금 얻는 오류는 IOError : 모드 F를 BMP로 쓸 수 없습니다. 나는 PIL 페이지에서 문서를 확인했고 .bmp를 사용한다고 말 했으므로 전반적으로 왜 작동하지 않는지 알 수 없습니다.
user1999274 2013-01-23

@ user1999274 나를 위해 작동하는 것 같은 업데이트를 게시했습니다 (세부 사항이 부족한 것에 대해 사과합니다-내가 함께 갈 때 함께 연결)).
RocketDonkey 2013 년

@RocketDonkey는 푸리에 변환의 결과를 RGB 색상 공간으로 변환하면 의미없는 이미지를 제공하기 때문에 그보다 조금 더 똑똑했습니다. 더 이상 예외를 발생시키지 않는다고해서 결과가 정확하다는 의미는 아닙니다.
mmgp 2013-01-23

합의 @mmgp - : I +1 당신과는 OP 희망 이유를 받아 그
RocketDonkey

4

나는 이것이 오래되었다는 것을 알고 있지만 필로우를 사용하는 동안 파일을 사용하여 파일을 연 open(fp, 'w')다음 저장하면 작동 한다는 것을 알았 습니다. 예 :

with open(fp, 'w') as f:
    result.save(f)

fp 물론 파일 경로입니다.


1
Pillow의 문서에 따르면 format파일 객체가 .NET에서 사용되는 경우 매개 변수를 사용해야합니다 save. 이것이 필요하지 않습니까?
Rob Rose

@RobRose 테스트 중에 답변을 게시했을 때 필요한 것을 찾지 못했습니다. 그러나 지금은 그럴 수 있습니다. 당신이 어떤 테스트가 입증되면 그것은 필요 알려 그리고 내 대답은 편집 할 수 있습니다
necko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.