кажется, что изображение подушки хранит только некоторые индексы или ссылки вместо реальных пикселей? - PullRequest
0 голосов
/ 26 июня 2019

за это сообщение

sys.getsizeof () может быть использован для получения размера объекта в байтах.

img = plt.imread('Lenna.png')
sys.getsizeof(img)
3145856

это разумно.

Подушка Изображение, кажется, делает это по-другому.

img_opened_by_pillow = Image.open('Lenna.png')
sys.getsizeof(img_opened_by_pillow)
56

кажется, что img_opened_by_pillow хранит только некоторые индексы или ссылки вместо реальных пикселей. мое понимание верно?

1 Ответ

1 голос
/ 26 июня 2019

sys.getsizeof() никоим образом не является надежным способом получения общего размера объекта.В то время как изображения - или другие объекты - хранящиеся в виде единого массива (с использованием numpy или нет), общий объем памяти будет сообщаться более или менее точно, если объект находится на более высоком уровне, оборачиваясь вокруг фактических данных, как в случае изображений Pillowили словарь, содержащий другие словари и списки, он потерпит неудачу.

В Интернете существуют рецепты для рекурсивного запуска getize всех связанных объектов для родительского объекта, но это также ненадежно.В общем, Python - это слишком высокий уровень, чтобы вы беспокоились о размерах побайтных объектов.Что касается общей идеи (в 10 раз), то, как правило, можно сказать, основываясь на опыте.Для изображения это будет примерно ширина х высота х 4 байта.

Вы можете использовать методы .tobytes и аналогичные, чтобы получить действительные байты изображения, и подумать о 500 байтах или около того служебных данных для метаданных.

Что касается самих данных изображения, текущая версия PIL хранит их в ключе "data" атрибута __array_interface__ объекта Image (т.е. img.__array_interface__["data"]).Это, к сожалению, внутренняя деталь реализации, и для доступа к фактическим данным о пикселях должен использоваться открытый метод .tobytes.

...