Tudo bem, estou brincando com a conversão de um objeto de imagem PIL para frente e para trás em uma matriz numpy para que eu possa fazer transformações mais rápidas de pixel por pixel do que o PixelAccess
objeto do PIL permitiria. Eu descobri como colocar as informações de pixel em uma matriz numpy 3D útil por meio de:
pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
Mas não consigo descobrir como carregá-lo de volta no objeto PIL depois de fazer todas as minhas transformações impressionantes. Estou ciente do putdata()
método, mas não consigo fazê-lo se comportar.
pic.size[0]
epic.size[1]
deve ser trocado (ou sejareshape(pic.size[1], pic.size[0], 3)
), uma vez quesize
éwidth x height
oux * y
, enquanto a ordem da matriz érows x columns
.Respostas:
Você não está dizendo exatamente como
putdata()
não está se comportando. Estou assumindo que você está fazendoIsso ocorre porque
putdata
espera uma sequência de tuplas e você está fornecendo uma matriz numpy. estevai funcionar, mas é muito lento.
A partir do PIL 1.1.6, a maneira "adequada" de converter imagens e matrizes numpy é simplesmente
embora a matriz resultante esteja em um formato diferente do seu (matriz 3-d ou linhas / colunas / rgb nesse caso).
Depois de fazer as alterações na matriz, você poderá fazer uma
pic.putdata(pix)
ou criar uma nova imagemImage.fromarray(pix)
.fonte
Image.fromarray
não está listado na documentação do PIL (!), Então eu nunca o encontraria se não fosse por isso.numpy.asarray(pic)
como a maneira "adequada" de converter, nãonumpy.array(pic)
. De acordo com esta resposta,array
você fará uma cópiaasarray
e não (mas oasarray
resultado será somente leitura).Abra
I
como uma matriz:Faça algumas coisas para
I
convertê-lo novamente em uma imagem:Filtre imagens numpy com FFT, Python
Se você quiser fazê-lo explicitamente por algum motivo, existem funções pil2array () e array2pil () usando getdata () nesta página em correlação.zip.
fonte
import Image
primeiro? Você tem o PIL instalado?uint8
conversão é necessária?numpy.asarray(Image.open(filename))
parece funcionar para imagens .jpg, mas não para .png. O resultado é exibido comoarray(<PngImagePlugin.PngImageFile image mode=LA size=500x500 at 0x3468198>, dtype=object)
. Parece não haver métodos obviamente nomeados doPngImagePlugin.PngImageFile
objeto para resolver isso. Acho que devo fazer isso como uma nova pergunta, mas é muito relevante para este tópico. Alguém entende o que está acontecendo de errado aqui?getdata()
retorna uma sequência como objeto ( pillow.readthedocs.io/en/3.4.x/reference/… ), mas uma imagem de travesseiro implementa o__array_interface__
quenumpy
pode ser usado para acessar os bytes brutos de uma imagem sem precisar passar por um iterador (consulte github.com/python-pillow/Pillow/blob/… e docs.scipy.org/doc/numpy/reference/arrays.interface.html ). Você pode até usarnumpy.array(PIL.Image.open('test.jpg'))
Estou usando o Pillow 4.1.1 (o sucessor do PIL) no Python 3.5. A conversão entre travesseiro e numpy é simples.
Uma coisa que precisa ser notada é que o estilo Pillow
im
é o principal da coluna, enquanto o estilo numpyim2arr
é o principal da linha. No entanto, a funçãoImage.fromarray
já leva isso em consideração. Ou seja,arr2im.size == im.size
earr2im.mode == im.mode
no exemplo acima.Devemos cuidar do formato de dados HxWxC ao processar as matrizes numpy transformadas, por exemplo, faça a transformação
im2arr = np.rollaxis(im2arr, 2, 0)
ouim2arr = np.transpose(im2arr, (2, 0, 1))
no formato CxHxW.fonte
np.flipud
correção. Embora minha imagem PIL tenha sido criada do zero usandoImageDraw.Draw
. Eu acho que é preciso ter cuidado de onde vem a origem de suas coordenadas.Você precisa converter sua imagem em uma matriz numpy da seguinte maneira:
fonte
.convert("L")
por.convert("RGB")
O exemplo que eu usei hoje:
fonte
Se sua imagem estiver armazenada no formato Blob (ou seja, em um banco de dados), você poderá usar a mesma técnica explicada por Billal Begueradj para converter sua imagem de Blobs em uma matriz de bytes.
No meu caso, eu precisava das minhas imagens armazenadas em uma coluna de blob em uma tabela db:
Criei uma função auxiliar para alterar meu conjunto de dados em np.array:
Depois disso, pude usar os byteArrays na minha rede neural.
fonte
Converter
Numpy to PIL
imagem ePIL to Numpy
fonte
Você pode transformar a imagem em numpy analisando a imagem na função numpy () depois de extrair os recursos (desnormalização)
fonte