Acabei de fazer algum processamento de imagem usando a biblioteca de imagens Python (PIL) usando um post que encontrei anteriormente para realizar transformações de Fourier de imagens e não consigo fazer a função salvar funcionar. Todo o código funciona bem, mas não vai salvar a imagem resultante:
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")
O erro que recebo é o seguinte:
save_handler = SAVE[string.upper(format)] # unknown format
KeyError: '.BMP'
Como posso salvar uma imagem com Pythons PIL?
fonte
fft2
vez de,rfft2
pois para dados discretos não vejo sentido em usar o último. O resto é puramente cosmético, ou seja, você não seria capaz de visualizar adequadamente a transformada de Fourier sem aplicar um fator de log a ela. Então a normalização é manter as coisas simples para a conversão para o intervalo [0, 255].visual = (visual - visual.min()) / (visual.max() - visual.min())
será o padrão sevisual
não tiver variação (improvável, mas vale a pena capturar)Você deve ser capaz de simplesmente deixar o PIL obter o tipo de arquivo da extensão, ou seja, usar:
fonte
numpy.uint8
dtype em vez de float.Tente remover o
.
antes de.bmp
(não correspondeBMP
ao esperado). Como você pode ver pelo erro,save_handler
está colocando em maiúsculas o queformat
você forneceu e procurando uma correspondênciaSAVE
. No entanto, a chave correspondente nesse objeto éBMP
(em vez de.BMP
).Não sei muito sobre
PIL
, mas de uma busca rápida ao redor parece que é um problema com omode
da imagem. Alterando a definição dej
para:Pareceu funcionar para mim (no entanto, note que tenho muito pouco conhecimento sobre
PIL
isso, então sugiro usar a solução de @mmgp, pois ele / ela sabe claramente o que está fazendo :)). Para os tipos demode
, usei esta página - espero que uma das opções funcione para você.fonte
Eu sei que isso é antigo, mas descobri que (ao usar o Pillow) abrir o arquivo usando
open(fp, 'w')
e salvá-lo funcionará. Por exemplo:fp
sendo o caminho do arquivo, é claro.fonte
format
parâmetro deve ser usado se um objeto de arquivo for usado emsave
. Isso não é necessário?