Можно ли загружать и отображать большие (8296 x 14740 пикселей) изображения в python?

Мне нужен мой скрипт Python для загрузки и отображения большого (35 МБ - 8296 пикселей x 14740 пикселей) изображения в формате tiff. Я пробовал с openCV:

img = cv2.imread("filename.tif",-1)
cv2.namedWindow('map',cv2.WINDOW_NORMAL)
cv2.imshow('map',img)

и я получил:

OpenCV Error: Assertion failed (size.width>0 && size.height>0)
in cv::imshow, file ..\..\..\..\opencv\modules\highgui\src\window.cpp, line 261

cv2.error: ..\..\..\..\opencv\modules\highgui\src\window.cpp:261:
error: (-215) size.width>0 && size.height>0 in function cv::imshow

Я также пробовал с matplotlib:

img = cv2.imread("filename.tif",-1)
pyplot.imshow(img)
pyplot.show()

и я получил:

TypeError: Image data can not convert to float

Как загрузить и отобразить такой файл?


person Bajzel    schedule 10.04.2015    source источник
comment
Не могли бы вы загрузить пример такого изображения куда-нибудь?   -  person hitzg    schedule 10.04.2015
comment
Файл добавлен в основной пост   -  person Bajzel    schedule 10.04.2015


Ответы (2)


Matplotlib предоставляет удобную функцию для загрузки изображений:

import matplotlib.pyplot as plt

img = plt.imread('filename.tif')
plt.imshow(img)
plt.show()
person hitzg    schedule 10.04.2015
comment
И это приводит к следующему: Размер изображения (122283040 пикселей) превышает ограничение в 89478485 пикселей, это может быть DOS атака декомпрессионной бомбы. Предупреждение о декомпрессионной бомбе. Ошибка памяти - person Bajzel; 10.04.2015
comment
Да, я понимаю это как предупреждение. Но код все еще работает - person hitzg; 10.04.2015
comment
А изображение отображается? На моей стороне это заканчивается MemoryError, и больше ничего не происходит. - person Bajzel; 10.04.2015
comment
Загрузка данных и их отображение занимает несколько секунд. Но изображение отображается нормально - person hitzg; 10.04.2015
comment
Я думаю, вы получаете только DecompressionBombWarning, но я также получаю MemoryError. Любая идея, как избавиться от него? - person Bajzel; 10.04.2015
comment
Ну, MemoryError говорит вам, что у вас недостаточно памяти. Вы можете освободить некоторые из них, предварительно закрыв другие программы. Но если вы хотите только отобразить изображение, я бы посоветовал сначала уменьшить его масштаб. - person hitzg; 10.04.2015
comment
Не могу этого сделать. Таких изображений около 800. Meaby, если я попытаюсь использовать пирамиды изображений перед их отображением. - person Bajzel; 10.04.2015
comment
Что ты не можешь сделать? Разве уменьшение масштаба не то же самое, что использование пирамид? - person hitzg; 10.04.2015
comment
Ты прав. Я думал, что Вы попросите меня уменьшить это изображение в другом месте, а затем попытаться отобразить его. Прямо сейчас я понятия не имею, как его уменьшить, поэтому я думаю, что вопрос исчерпан. - person Bajzel; 10.04.2015
comment
Если вы используете Linux, вы можете использовать что-то вроде: convert filename.tif -resize 20% filename_smaller.tif - person hitzg; 10.04.2015

Я открыл его с помощью PIL:

from PIL import Image
img = Image.open('filename.tiff')
img.show()

Я получаю DecompressionBombWarning, но он открывается через несколько секунд.

person Bajzel    schedule 10.04.2015