Почему этот PIL вызывает аварийный питон? - PullRequest
2 голосов
/ 24 марта 2011
import Image
from numpy import zeros, asarray
YUV = zeros((240, 320, 3), dtype='uint8')
im = Image.fromarray(YUV, mode="YCbCr")
blah = asarray(im)

Когда я запускаю это (IPython 0.10.1 на Py 2.7.1), кажется, что python читает некоторую память, которую он не должен читать.Иногда происходит сбой, иногда - нет, но я, безусловно, могу его вызвать, увеличив нули 320x240, например, до 3200x2400 и / или вызвав blah.copy ().Кроме того, если я сделаю:

from matplotlib import pyplot as p
p.subplot(221); p.imshow(blah[:,:,0])
p.subplot(222); p.imshow(blah[:,:,1])
p.subplot(223); p.imshow(blah[:,:,2])
p.subplot(224); p.imshow(blah[:,:,3])
p.gray()
p.show()

, я начну видеть ненужную память, появившуюся в бла примерно в строке 180. Что здесь происходит?Я плохо конвертирую из PIL Image в массив numpy?В чем разница между использованием массива (im) вместо asarray (im) и что является предпочтительным?(обратите внимание, что в первом случае он все еще иногда дает сбой, но кажется, что он более стабилен и менее мусорный)

1 Ответ

4 голосов
/ 24 марта 2011

Я заметил, что ваше изображение YCbCr 3-канальное, но вы отображаете 4 канала.Оказывается, проблема «нежелательных данных» вызвана ошибкой в ​​интерфейсе массива PIL , а исправление было зафиксировано в ноябре 2010 .Интерфейс массива PIL возвращает 4-й канал.

Я запустил ваш тестовый пример в соответствии с PIL 1.1.7 и вижу шум.Я прокомментировал подпоток 224 и повторно провел тест, используя последний код магистрали PIL , и был получен правильный 3-канальный массив без шума.Сбой также может быть связан, но я не смог воспроизвести это в моем окружении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...