Как преобразовать Изображение PIL в массив numpy?

Ошибка синтаксиса: ошибка синтаксиса, неожиданный T_ENCAPSED_AND_WHITESPACE

Эта ошибка чаще всего встречается при попытке ссылаться на значение массива с помощью ключевого слова для интерполяции внутри строки с двумя кавычками , когда вся конструкция комплексной переменной не заключена в {}.

Случай ошибки:

Это приведет к Unexpected T_ENCAPSED_AND_WHITESPACE:

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

Возможные исправления:

В строке с двойными кавычками PHP разрешает использовать строки ключей ключей без кавычек и не выдаст E_NOTICE. Таким образом, вышесказанное может быть записано как:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

Вся сложная переменная массива и ключ (ы) могут быть заключены в {}, и в этом случае они должны быть указаны чтобы избежать E_NOTICE. Документация PHP рекомендует этот синтаксис для сложных переменных.

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

Конечно, альтернатива любой из вышеперечисленного заключается в объединении переменной массива in вместо интерполировать его:

echo "This is a double-quoted string with an array variable " . $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

Для справки см. раздел «Переменная синтаксический анализ» в странице руководства PHP Strings

209
задан kmario23 27 April 2019 в 12:17
поделиться

2 ответа

Вы не говорите, как точно putdata() не ведет себя. Я предполагаю, что Вы делаете

>>> pic.putdata(a)
Traceback (most recent call last):
  File "...blablabla.../PIL/Image.py", line 1185, in putdata
    self.im.putdata(data, scale, offset)
SystemError: new style getargs format but argument is not a tuple

, Это вызвано тем, что putdata ожидает последовательность кортежей, и Вы даете ей массив numpy. Это

>>> data = list(tuple(pixel) for pixel in pix)
>>> pic.putdata(data)

будет работать, но это очень медленно.

С PIL 1.1.6, "надлежащий" способ преобразовать между изображениями и массивами numpy просто

>>> pix = numpy.array(pic)

, хотя полученный массив находится в другом формате, чем Ваш (3-й массив или rows/columns/rgb в этом случае).

Затем после внесения изменений в массив необходимо быть в состоянии сделать или pic.putdata(pix) или создать новое изображение с Image.fromarray(pix).

245
ответ дан dF. 23 November 2019 в 04:38
поделиться

Открыть I в виде массива:

>>> I = numpy.asarray(PIL.Image.open('test.jpg'))

Сделайте что-нибудь с I , затем преобразуйте его обратно в изображение:

>>> im = PIL.Image.fromarray(numpy.uint8(I))

Отфильтруйте количество изображений с помощью БПФ, Python

Если вы хотите сделать это явно по какой-то причине существуют функции pil2array () и array2pil (), использующие getdata () на этой странице в correlation.zip.

167
ответ дан 23 November 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: