OpenCV не будет загружать большое изображение (~4GB)
Я работаю над программой, которая должна обнаруживать цветные контрольные точки с довольно большого изображения. Изображение TIFF составляет около 3-4 ГБ (aboud 35 000 x 33 000 пикселей). Я использую Python 2 и OpenCV для обработки изображений.
import cv2
img = 'ortho.tif'
I = cv2.imread(img, cv2.IMREAD_COLOR)
эта часть не (всегда) выдает сообщение об ошибке. При показе изображения делает:
cv2.imshow('image', I)
Я также попытался показать изображение с помощью matplotlib:
plt.imshow(I[:, :, ::-1]) # Hack to change BGR to RGB
есть ли какие-либо ограничения на OpenCV или Python относительно больших изображений? Что бы вы предложили, чтобы загрузить этот iamge?
PS: компьютер, на котором я делаю эту работу, - это рабочая станция Windows 10 (у нее достаточно лошадиных сил для работы с изображением).
заранее, спасибо за помощь :)
2 ответов
реализация imread()
:
Mat imread( const string& filename, int flags )
{
Mat img;
imread_( filename, flags, LOAD_MAT, &img );
return img;
}
это выделяет матрицу, соответствующую загрузке изображения в виде смежного массива. Таким образом, это зависит (по крайней мере частично) от производительности вашего оборудования: ваша машина должна иметь возможность выделять 4 ГБ непрерывного массива ОЗУ (если вы находитесь в дистрибутиве Debian, вы можете проверить размер ОЗУ, запустив, например,vmstat -s -SM
).
любопытство, я попытался получить непрерывный массив памяти (большой, но меньше чем тот, который требуется вашему изображению 4 GB) с помощью ascontiguousarray
, но до этого я уже наткнулся на проблему выделения памяти:
>>> img = numpy.zeros(shape=(35000,35000))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
>>>
на практике, даже если у вас достаточно оперативной памяти, это не хорошая идея, чтобы манипулировать пикселями изображения 4 ГБ оперативной памяти, и вам нужно будет разделить его в любом случае с точки зрения регионы интересов, меньшие площади и может быть каналы тоже, в зависимости от характер операций, которые вы хотите выполнить на пикселов.
EDIT 1:
как я сказал в своем комментарии ниже вашего ответа, если у вас есть 16 ГБ ОЗУ, и вы можете прочитать это изображение с scikit тогда нет причин, по которым вы не можете сделать то же самое с OpenCV.
пожалуйста, попробуйте:
import numpy as np # Do not forget to import numpy
import cv2
img = cv2.imread('ortho.tif')
вы забыли импортировать Numpy в исходный код, и именно поэтому OpenCV явно не удалось загрузить изображение. Все структуры массивов OpenCV преобразуются в массивы Numpy и из них, а изображение, которое Вы читаете, представлено OpenCV в виде массивов в памяти.
EDIT 2:
в формате OpenCV может справиться с снимки размером до 10 ГБ. Но это верно, когда речь идет
получается, что scikit-image пришел на помощь, который я узнал от здесь.
следующее позволяет мне загрузить изображение в сеанс python:
import numpy as np
from skimage.io import imread
img = imread(path_to_file)
загрузка заняла около полминуты или около того.