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)

загрузка заняла около полминуты или около того.