PIL не может обработать этот тип данных - PullRequest
5 голосов
/ 09 октября 2011

Я пытаюсь использовать модуль fft в numpy:

import Image, numpy

i = Image.open('img.png')
a = numpy.asarray(i, numpy.uint8)

b = abs(numpy.fft.rfft2(a))
b = numpy.uint8(b)

j = Image.fromarray(b)
j.save('img2.png')

Однако, когда я пытаюсь преобразовать массив numpy обратно в образ PIL, я получаю ошибку:

TypeError: Cannot handle this data type

Однако массивы a и b, похоже, имеют одинаковый тип данных (uint8), и выполнение Image.fromarray(a) работает нормально. Я заметил, что формы немного отличаются (a.shape = (1840, 3264, 3) и b.shape = (1840, 3264, 2)).

Я исправлю это и выясню, какие типы данных принимает PIL?

1 Ответ

6 голосов
/ 09 октября 2011

Я думаю, что, возможно, rfft2 выполняется по неправильным осям. По умолчанию используются последние две оси: axes=(-2,-1). Третья ось представляет каналы RGB. Вместо этого кажется более правдоподобным, что можно выполнить БПФ по пространственным осям, axes=(0,1):

import Image
import numpy as np

i = Image.open('image.png').convert('RGB')
a = np.asarray(i, np.uint8)
print(a.shape)

b = abs(np.fft.rfft2(a,axes=(0,1)))
b = np.uint8(b)
j = Image.fromarray(b)
j.save('/tmp/img2.png')
...