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

이미지의 푸리에 변환을 수행하기 위해 이전에 찾은 게시물을 사용하여 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로 이미지를 어떻게 저장할 수 있습니까?



답변

파일 확장자에 관한 오류가 처리되었습니다. 사용하거나 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')


답변

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

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


답변

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

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

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

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


답변

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

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

fp 물론 파일 경로입니다.


답변